从prop更新更新状态将导致循环错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从prop更新更新状态将导致循环错误相关的知识,希望对你有一定的参考价值。

我想更新状态,我从子组件得到的值,但由于一些奇怪的原因,如果我在我的方法中使用setstate,我将得到循环错误。这是我的代码片段:

class ParentTab extends Component {
  constructor(props) {
    super(props);
    this.state = {
      displayVal : '0',
    };
  }

  totalRec = value => {
    console.log('value', value); // will show the value '2' after getting it from ChildTab component 
    if (value) {
      // will cause infinite loop error
      this.setState({
        displayVal: value.toString(),
      });
    }
}

  render() {
    console.log('totalRec', this.totalRec()); // will show undefined because there is delay in getting the value.
    return (
      <div>
        <ChildTab totalRow={this.totalRec} {...this.props} />
        />
        Value: {this.state.displayVal} // will show undefined
      </div>
    );
  }
}

ChildTab组件将从数据库中获取价值,因此会有延迟。整个页面将首先渲染,因此this.totalRec()未定义。这就是为什么我想用state重新渲染它。

但是,如果触发totalRec()方法,当我尝试在react方法中使用this.setState时,我将得到totalRec()循环错误。

我该如何解决这个问题?提前致谢。

答案
  1. 要打破循环,你可以简单地返回false中的shouldComponentUpdate(nextProps, nextState),当this.state.displayVal === nextState.displayVal或更合适的条件基于你的问题。请参阅:https://reactjs.org/docs/react-component.html#shouldcomponentupdate
  2. 另一个问题可能是setState不会立即触发,因此任何代码依赖于state可能会使用旧值,如果你在setState之后调用它。解决方案是编写async函数和await this.setState({...});。请参阅:https://reactjs.org/docs/react-component.html#setstate
  3. 传入子组件的props应该是只读的。不要在子组件中更改它们。

以上是关于从prop更新更新状态将导致循环错误的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 计算属性显示“在视图更新期间修改状态,这将导致未定义的行为。”错误

在render()中更新状态时,防止无限循环

NetInfo 状态更新错误

测试时,导致React状态更新的代码应包装为act(…)

cakephp 没有将更新值保存到相关表,但没有错误

Java问题记录——循环里的二次判断与状态更新