gpt4 book ai didi

javascript - 使用 shouldComponentUpdate 来打破状态设置循环?

转载 作者:行者123 更新时间:2023-12-01 04:08:22 27 4
gpt4 key购买 nike

我正在开发一个 React 应用程序,并偶然发现了一种情况,如果我不使用 shouldComponentUpdate() 来阻止,我的组件就会不断地相互更新。我正在尝试确定这是否是处理此类更改的最佳方法,或者我是否应该尝试重构我的代码,这样我就不必以这种方式停止更新。

我的实际代码充满了一堆其他正在发生的事情,所以我整理了几个虚拟示例。

父组件:

    class App extends React.Component {
constructor() {
super();

this.stateChange = this.stateChange.bind(this);

this.state = {
foo: 'bar'
}
}


stateChange(change) {
this.setState({foo: change});
}

render() {
return (
<div>
<p>Hello World</p>
<ChildComponent stateChange={this.stateChange} />
</div>
)
}

}

子组件:

    class ChildComponent extends React.Component {
constructor() {
super();

this.renderDecision = this.renderDecision.bind(this);
this.updateStage = this.updateStage.bind(this);
this.state = {
stage: [1],
hello: 'world'
}
}

updateStage(e) {
let theStage = [...this.state.stage];
theStage.push(1);
this.setState({stage: theStage});
}

renderDecision() {

if (this.state.stage.length < 3) {
return (
<p>There are {this.state.stage.length} items. <button onClick={(e) => this.updateStage(e)}>Click here to update.</button></p>
)
} else if (this.state.stage.length === 3) {
this.props.stateChange(this.state.hello); /// updates the parent which updates the child which updates the parent... ad infinitum
return (
<p>Hello {this.state.hello}, there are {theStage} items.</p>
)
}
}

render() {
return (
<div>
(this.renderDecision())
</div>
)
}
}

正如您所看到的,一旦 stage 数组达到长度 3 并保持在那里,应用程序和子组件就会被锁定到设置状态的循环中。

可以通过向 ChildComponent 添加类似内容来修复此问题 --

      componentShouldUpdate() {
if (this.state.stage.length === 3) {
return false;
} else return true;
}

但我想知道这是否是最佳实践,或者我是否应该提出其他解决方案。我的子组件具有状态,因为它快速连续地循环通过大约 6 个不同的参数,而应用程序的其余部分不必知道发生了什么,因此通过传递 stage 来重新渲染整个应用程序是没有意义的 一直回到父级。

希望这个问题有意义。感谢您的阅读。

最佳答案

你永远不应该改变渲染状态,检查这个issue 。在渲染之外做出这些状态决策和人口。

关于javascript - 使用 shouldComponentUpdate 来打破状态设置循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com