我知道React可能会异步且批量执行状态更新以进行性能优化。因此,您永远不能相信调用setState
后状态是否已更新。但是,您可以相信React会按照与setState
调用相同的顺序更新state吗?
- 在同一个组件中?
- 在不同的组件中?
考虑单击以下示例中的按钮:
1. 对于以下情况,a为false且b为true的可能性是否存在:
class Container extends React.Component {
constructor(props) {
super(props);
this.state = { a: false, b: false };
}
render() {
return <Button onClick={this.handleClick}/>
}
handleClick = () => {
this.setState({ a: true });
this.setState({ b: true });
}
}
2. 以下情况中是否有可能是 a 为假且 b 为真 :
class SuperContainer extends React.Component {
constructor(props) {
super(props);
this.state = { a: false };
}
render() {
return <Container setParentState={this.setState.bind(this)}/>
}
}
class Container extends React.Component {
constructor(props) {
super(props);
this.state = { b: false };
}
render() {
return <Button onClick={this.handleClick}/>
}
handleClick = () => {
this.props.setParentState({ a: true });
this.setState({ b: true });
}
}
请记住,这些是我使用情况的极端简化。我认识到我可以以不同的方式完成这个任务,例如在示例1中同时更新两个状态参数,以及在示例2中将第二个状态更新作为回调执行第一个状态更新。然而,这不是我的问题,我只对React如何执行这些状态更新有兴趣,其他内容不感兴趣。
任何有文档支持的答案都将受到赞赏。
handleClick
方法将被批处理,所以你不必担心会出现a=true
和b=false
的情况。 - Michal