You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJs报错:Maximum update depth exceeded 解决方案求助

解决Maximum update depth exceeded错误的方案

错误原因

你遇到的无限更新循环,是因为点击搜索按钮或按下回车后,设置fireNavigate为true触发<Navigate />组件执行路由跳转。如果跳转后的页面仍包含SearchInput组件,该组件会再次渲染并触发<Navigate />,形成无限循环跳转,最终导致更新深度超出限制。

修复步骤

1. 用编程式导航替代声明式<Navigate />

React Router的useNavigate钩子更适合这种触发式跳转场景,能避免意外的循环渲染:

  • 导入useNavigate:
import { useNavigate } from "react-router-dom";
  • 在组件内初始化导航实例:
const navigate = useNavigate();

2. 移除fireNavigate相关状态与渲染逻辑

不需要通过状态控制跳转,直接在事件中调用导航方法:

// 删除fireNavigate状态定义
// const [fireNavigate, setFireNavigate] = useState(false);

const handleKeyDown = (event) => {
  if (event.key === "Enter") {
    setSearchValue(inputChange);
    navigate("/search");
  }
};

const handleClick = () => {
  setSearchValue(inputChange);
  navigate("/search");
};

3. 优化受控组件逻辑(可选但推荐)

输入框已是受控组件(绑定value和onChange),直接使用inputChange状态值即可,无需依赖useRef获取内容,避免状态与DOM值不一致的潜在问题:

// 删除ref相关代码
// const inputRef = useRef(null);

// 输入框移除ref属性
<input
  className="search-input"
  onChange={inputChangeHandler}
  value={inputChange}
  type="text"
  onKeyDown={handleKeyDown}
  placeholder={props.placeholder}
/>

完整修复后的代码

import "./SearchInput.css";
import Search from "../../../assets/Images/icon/search-normal.svg";
import { useNavigate } from "react-router-dom";
import { React, useState } from "react";
import { useAppContext } from "../../../Context/SearchContext/SearchContext";

const SearchInput = (props) => {
  const [inputChange, setInputChanage] = useState("");
  const navigate = useNavigate();

  const { setSearchValue } = useAppContext();

  const inputChangeHandler = (event) => {
    setInputChanage(event.target.value);
  };

  const handleKeyDown = (event) => {
    if (event.key === "Enter") {
      setSearchValue(inputChange);
      navigate("/search");
    }
  };

  const handleClick = () => {
    setSearchValue(inputChange);
    navigate("/search");
  };

  return (
    <div className="search-input-container">
      <input
        className="search-input"
        onChange={inputChangeHandler}
        value={inputChange}
        type="text"
        onKeyDown={handleKeyDown}
        placeholder={props.placeholder}
      />
      <button className="search-icon" onClick={handleClick}>
        <img src={Search} width="100%" height="100%" alt="search icon" />
      </button>
    </div>
  );
};

export default SearchInput;

内容的提问来源于stack exchange,提问作者fateme barzegar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:55:45