提问者:小点点

ReactJS-超出最大更新深度错误


我面临一个错误:

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

守则如下:

  componentDidUpdate() {
    this._updateLocalStorage();

    if (this.state.searchValue !== "") {
      this.setState({
        filteredNotes: this.state.notes.filter(
          note =>
            note.text
              .toLowerCase()
              .indexOf(this.state.searchValue.toLowerCase()) !== -1
        )
      });
    } else {
      this.setState({
        filteredNotes: this.state.notes 
      });
    }
  }


共3个答案

匿名用户

如果在主状态调用之前两个状态相等,则可以通过放置空比较来修复此问题。此外,我还改变了else的状况。

  componentDidUpdate(prevProps, prevState) {
    this._updateLocalStorage();

    if (this.state.searchValue !== "") {
      this.setState({
        filteredNotes: this.state.notes.filter(
          note =>
            note.text
              .toLowerCase()
              .indexOf(this.state.searchValue.toLowerCase()) !== -1
        )
      });
    } else if(prevState.filteredNotes === this.state.filteredNotes) {
      //do nothing
    } else if(this.state.searchValue === "") {
      this.setState({
        filteredNotes: this.state.notes 
      });
    }
  }

匿名用户

如果状态发生更改,则每次都会调用componentDidUpdate。

因此,您可能需要在内部谨慎使用setState

为这些setState严格设置条件。也许像下面这样:

一些注意事项:

  • 对象比较
  • 值/地址引用
componentDidUpdate(pervProps, prevState) {
  if (prevState.filteredNotes !== this.state.filteredNotes) {
    this._updateLocalStorage();
    if (this.state.searchValue !== "") {
      this.setState({
        filteredNotes: this.state.notes.filter(
          note =>
            note.text
              .toLowerCase()
              .indexOf(this.state.searchValue.toLowerCase()) !== -1
        )
      });
    } else {
      this.setState({
        filteredNotes: this.state.notes 
      });
    }
  }
}

匿名用户

这就是正在发生的事情:

  1. 在CDM中一次<代码>此。状态searchValue获取真实值-它更新状态
  2. CDM状态更新
  3. 第一步。重复
  4. 第二步。重复
  5. 无休止的更新

你应该做什么:

  1. 将CDU更新到此组件didUpdate(prevProps,prevState)
if(this.state.searchValue !== "" && this.state.searchValue !== prevState.searchValue) {...}