从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()
循环错误。
我该如何解决这个问题?提前致谢。
答案
- 要打破循环,你可以简单地返回
false
中的shouldComponentUpdate(nextProps, nextState)
,当this.state.displayVal === nextState.displayVal
或更合适的条件基于你的问题。请参阅:https://reactjs.org/docs/react-component.html#shouldcomponentupdate - 另一个问题可能是
setState
不会立即触发,因此任何代码依赖于state
可能会使用旧值,如果你在setState
之后调用它。解决方案是编写async
函数和await this.setState({...});
。请参阅:https://reactjs.org/docs/react-component.html#setstate - 传入子组件的
props
应该是只读的。不要在子组件中更改它们。
以上是关于从prop更新更新状态将导致循环错误的主要内容,如果未能解决你的问题,请参考以下文章