当前位置: 首页 > 知识库问答 >
问题:

我收到错误超过了最大更新深度。当组件在组件WillUpdate或组件DidUpdate中重复调用setState时,可能会发生这种情况。

云骏奇
2023-03-14

有很多类似的问题,尽管我在这里发布。

我收到以下错误:

未捕获的不变量冲突:超过最大更新深度。当组件在componentWillUpdate或componentDidUpdate内重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量,以防止无限循环。

请注意,我还没有在page中使用过这样的功能。

选择日期选取器时出错:

constructor(props){
super(props);
this.state={
fields: {},
errors: {}
}
}
handleIssueDate(date){
       // this.state.IssueDate = moment(date).format("YYYY-MM-DD")
       debugger;
           let fields = this.state.fields;
           fields["IssueDate"] = moment(date).format("YYYY-MM-DD")
           this.setState({
               fields
           });
           let errors = this.state.errors;
           if (errors[date] != "" || errors[date] != null) {
               errors["IssueDate"] = "";
           }

      }
render(){
return (
<DatePicker name="IssueDate" onChange={this.handleIssueDate} selected={this.state.fields.IssueDate} value={this.state.fields.IssueDate}  placeholderText={"YYYY-MM-DD"}  />)
}

已编辑:我刚刚从setState中移除了矩函数。现在它工作正常。请任何人解释这个奇怪的错误/行为。

共有2个答案

全鸿晖
2023-03-14

https://github . com/hacker 0x 01/react-date picker/blob/master/docs/date picker . MD

选定的类型是instanceOf(Date)不是字符串

长孙昀
2023-03-14

显然你正在改变国家。

let fields = this.state.fields; // fields still holds the reference to the state

fields["IssueDate"] = moment(date).format("YYYY-MM-DD") // here happens the mutation

this.setState({ // state is changed again
    fields,
});

errors["IssueDate"] = ""; // state mutation once again

建议方法

在状态中定义“IssueDate”字段:

state = {
   fields: {
      IssueDate: null,
   },
   error: {
      IssueDate: null,
   },
}

然后在你的onChange功能中:

this.setState(({ fields }) => ({
   fields: {
      ...fields,
      IssueDate: moment(date).format("YYYY-MM-DD"),
   },
});

对错误也这样做。

 类似资料:
  • 已经有一些人问了这个问题,但是他们几乎都是由相同的原因引起的(例如< code > 附言:一些实用程序函数是在幕后定义的。 错误出在中。我找不到我无限地重新渲染的地方。

  • 我正在做这个康威的生活游戏react项目,它工作得很好,但当我添加最后几个按钮来清除棋盘和其他一些功能时,react给了我这个错误 从代码片段来看,它向我展示了Clear()函数似乎是这里的问题所在,但我认为我没有在渲染()中设置状态来触发无限循环。这里是Clear和

  • 我正在尝试将基于类的组件转换为功能组件。如果在useEffect钩子中使用与componentDidMount下相同的代码,则会出现上述错误。 以下是发生错误的功能组件 抛出以下错误,浏览器崩溃未捕获(promise)错误:重新渲染过多。React限制渲染的数量以防止无限循环。

  • 我是新来的。反应路由器有问题 错误:超过了最大更新深度。当组件重复调用组件内部的setState时,可能会发生这种情况。React限制嵌套更新的数量以防止无限循环。 索引.tsx PrivateRoute.tsx: Main.tsx routes.tsx: App.tsx: 所以,问题是:如果没有确切的路线,我就没有这个错误,但是当将确切的道具传递给Private ateRoute时,我的商店组件

  • 我有两个简单的带有父子关系的reactjs组件。子级包含一个带有onChange事件的输入和一个回调父级以设置状态。当我运行它时,setState似乎在父组件中工作,但传递到子组件中的道具似乎没有更新。有什么想法吗?下面是一段代码片段: 在上面的示例中,子组件中的输入值保持为“bar”,尽管在父组件中触发了,并且通过。为什么输入值不改变以反映新的状态?

  • 早上好,我正在开发一个React应用程序,通过REST API与后端通信。 该应用程序体系结构还使用 React 路由器,并使用服务器提供并存储在中的 JWT 令牌实现身份验证功能。 基本上: 用户连接到应用程序 如果用户未登录,则重定向到登录页面 登录后,它会重定向到带有路径的主页,其中应该显示带有路径的组件和带有路径的组件(如果一个很好地理解React路由器的工作) 在启动应用程序时,用户被正