【发布时间】:2018-06-13 21:07:35
【问题描述】:
我试图将子数据保存为父状态,但由于setState() 调用render() 而导致无限循环。
错误消息: 超出最大更新深度。当组件在componentWillUpdate 或componentDidUpdate 内重复调用setState 时,可能会发生这种情况。 React 限制了嵌套更新的数量以防止无限循环。
对 React 来说相对较新,所以在谷歌搜索解决方案时我似乎无法说出这个问题。我知道为什么会发生错误,我只是不知道如何解决这个问题。有没有我可以使用的特定方法来防止重新渲染?
这里是父级:
export class ToDoList extends React.Component {
constructor(props){
super(props);
this.state = {
data: null
}
}
myCallback = (dataFromChild) => {
this.setState({data: dataFromChild.toUpperCase()})
}
render() {
return (
<div>
<ToDoItem callbackFromParent={this.myCallback}/>
</div>
);
}
}
孩子:
class ToDoItem extends React.Component {
constructor(props){
super(props);
this.state = {
listInfo: 'Doggos'
}
}
render(){
return(
<h1>{this.props.callbackFromParent(this.state.listInfo)}</h1>
);
}
}
【问题讨论】:
-
您能解释一下您要做什么吗?这段代码有很多问题。
-
你为什么还要调用那个回调?只需在
<h1>标签中显示listInfo即可。 -
不仅
componentWillUpdate和componentDidUpdate不应该调用setState,而且render也不应该引起状态改变。 -
您的代码完全按照您的要求执行。每次渲染时,它都会设置状态。这是一种反模式。在您明确您希望它做什么之前,无法确定如何最好地修复它。状态是否应该更新每个渲染?实际上应该显示什么?通过阅读您的代码,您似乎希望它做的就是您所描述的:无限循环。
-
@ChaseDeAnda 最终,我希望能够在兄弟姐妹之间共享数据,我试图通过将数据提供给作为中间人的父级来做到这一点。抱歉,不清楚,我只是在测试一些代码来查看数据流,所以这个 sn-p 实际上不应该做任何有用的事情。它应该只是用大写字母呈现数据(只是为了查看数据是否已通过父级)
标签: javascript reactjs