为什么在 React 组件中使用componentDidUpdate
更多推荐的setState
回调函数(可选的第二个参数)(如果需要同步 setState 行为)?
由于setState
是异步的,我在考虑使用setState
回调函数(第二个参数)来确保在状态更新后执行代码,类似于then()
Promise。特别是如果我需要在后续setState
调用之间重新渲染。
然而,React 官方文档说“setState() 的第二个参数是一个可选的回调函数,一旦 setState 完成并重新渲染组件就会执行。通常我们建议使用 componentDidUpdate() 代替这种逻辑。” 这就是他们在那里所说的一切,所以看起来有点含糊。我想知道是否有更具体的原因建议不要使用它?如果可以的话,我会问 React 的人自己。
如果我希望按顺序执行多个 setState 调用,就代码组织而言,setState 回调似乎是比 componentDidUpdate 更好的选择 - 回调代码就在 setState 调用中定义。如果我使用 componentDidUpdate 我必须检查相关状态变量是否改变,并在那里定义后续代码,这不太容易跟踪。此外,在包含 setState 调用的函数中定义的变量将超出范围,除非我也将它们置于 state 中。
以下示例可能会显示何时使用 componentDidUpdate 可能会很棘手:
private functionInComponent = () => {
let someVariableBeforeSetStateCall;
... // operations done on someVariableBeforeSetStateCall, etc.
this.setState(
{ firstVariable: firstValue, }, //firstVariable may or may not have been changed
() => {
let secondVariable = this.props.functionFromParentComponent();
secondVariable += someVariableBeforeSetStateCall;
this.setState({ secondVariable: secondValue });
}
);
}
对比
public componentDidUpdate(prevProps. prevState) {
if (prevState.firstVariableWasSet !== this.state.firstVariableWasSet) {
let secondVariable = this.props.functionFromParentComponent();
secondVariable += this.state.someVariableBeforeSetStateCall;
this.setState({
secondVariable: secondValue,
firstVariableWasSet: false,
});
}
}
private functionInComponent = () => {
let someVariableBeforeSetStateCall = this.state.someVariableBeforeSetStateCall;
... // operations done on someVariableBeforeSetStateCall, etc.
this.setState({
firstVariable: firstValue,
someVariableBeforeSetStateCall: someVariableBeforeSetStateCall,
firstVariableWasSet: true });
//firstVariable may or may not have been changed via input,
//now someVariableBeforeSetStateCall may or may not get updated at the same time
//as firstVariableWasSet or firstVariable due to async nature of setState
}
另外,除了一般推荐的 componentDidUpdate 之外,在什么情况下 setState 回调更适合使用?