javascript - setState 在此代码中的工作方式的混乱
问题描述
我是 React 的新手,正在学习 setState 的工作原理。所以,你可以看到下面的代码:
class Counter extends React.Component {
constructor(props) {
super(props);
this.handleReset = this.handleReset.bind(this);
this.state = {
count: 5
};
}
handleReset() {
this.setState({count:0})
this.setState({count:this.state.count+1})
}
render() {
return (
<div>
<button onClick={this.handleReset}>reset</button>
</div>
);
}
因此,我对上述代码的期望是,当我单击按钮时,它不会输出 1,而是将 1 添加到当前计数状态并显示 6。这就是我假设两个 setStates 在 handleReset 方法中工作的方式。我不知道为什么它呈现 6 而不是 1
解决方案
正如 Rikin 解释的那样,setState
将它们批处理在一起,只执行最后一个......是setState
的,它是异步的,并且确实需要回调,所以如果你想要你的预期结果,你可以这样做:
class Counter extends Component {
constructor(props) {
super(props);
this.state = { count: 5 };
this.handleReset = this.handleReset.bind(this);
}
handleReset() {
this.setState({ count: 0 },
/* here is you callback */
() => this.setState({ count: this.state.count + 1 }))
}
render() {
return (
<div>
<div>{this.state.count}</div>
<button onClick={this.handleReset}>reset</button>
</div>
);
}
}
希望它有所帮助......这是一个现场演示:https ://stackblitz.com/edit/react-dbc11s
setState
调用被批处理在一起,因此只有最后一个进行更新。为了解释这种情况,让我们使用 OP 的示例和一些更类似的硬编码更新:
handleReset() {
this.setState({ count: 0 })
this.setState({ count: 10 })
this.setState({ count: 100 })
this.setState({ count: this.state.count + 1 })
}
引擎盖下发生的事情是您可以将其视为:
Object.assign(
previousState, // { count: 5 }
{count: 0}, // { count: 0 }
{count: 10}, // { count: 10 }
{count: 100}, // { count: 100 }
{count: state.count + 1} // { count: 5 + 1}
)
Object.assign 覆盖的值,count
因此只有最后一个值才能进行最终更新,这恰好是6
如果要使用先前状态的值,则必须依赖在setState
执行时使用现有状态值的函数方法,然后对其执行更新操作。
推荐阅读
- mysql - 如何在 mySQL 语句中添加条件
- reactjs - 在 React Native 中使用带有 FlatList 的 keyextarctor 时出现警告
- javascript - 从 HTML 转换为 pdf 时如何将页码添加到固定页脚(通过使用 css 或 js)?
- firebase - “DocumentSnapshot”类没有实例获取器“doc”。接收方:“DocumentSnapshot”实例尝试调用:doc
- json - 如何为python创建一个json,每隔几分钟显示一次速度变化
- javascript - 从剪贴板 JS 获取 TEXT/HTML
- jquery - Jquery获取外部html并使用类隐藏元素
- autodesk-forge - POST 用户导入 v2 内部服务器错误
- r - R web 通过某个选项值进行抓取
- amazon-web-services - 避免在 EMR 集群中运行 Install Task Runner 步骤