javascript - 正确使用 setState 方法
问题描述
我是 React 的新手,有一本书告诉我使用 setState 方法是不正确的,如下例所示:
...
constructor(props) {
super(props);
this.state = {
counter: 0,
hasButtonBeenClicked: false
}
}
render() {
return (
<button onClick={ this.handleClick }>
Click
</button>
)
}
handleClick = () => {
this.setState({ counter: this.state.counter + 1 });
this.setState({ hasButtonBeenClicked: this.state.counter > 0 });
}
...
因为 React 异步执行对状态数据的更改,并且可以选择将多个更新组合在一起以提高性能。
我明白了,但由于 React 异步执行更改。第一个 setState 方法可能会在第二个 setState 方法之前首先被调用,这只是概率问题。但是无论我尝试了多少次,第二个 setState 方法总是首先被调用,为什么?
解决方案
尽管它们是异步执行的,但在同一浏览器和/或同一硬件上进行测试时,您不太可能看到差异。不同的浏览器以略微不同的方式优化指令集,这是检查性能的最佳选择(以及为什么仍然建议在所有主要桌面浏览器上进行测试,尽管商业上的 Chrome 通常“足够好”)。
执行此操作的最佳方法 - 假设您希望它们按特定顺序触发 - 将setState
调用链接如下:
handleClick = () => {
this.setState({ counter: this.state.counter + 1 }, () => {
this.setState({ hasButtonBeenClicked: this.state.counter > 0 })
});
}
但无论如何,我都会推荐一种不同的设计——将hasButtonBeenClicked
逻辑与计数器联系起来会带来问题。
推荐阅读
- typescript - 如何在“或”运算符定义中获取特定类型?
- java - 无法通过线程池创建更多线程来处理套接字(块 IO)
- ios - 与屏幕锁定动画的任何交互
- javascript - 如何解析 JavaScript 中 JSON 字符串数组的前 n 行?
- firebase - Firestore 空结果算作已读?
- c++ - 我可以在不知道 C 的情况下在 lua 中使用 CSound 吗?
- python - 多列交叉表
- python - django 频道配置不当:在 ASGI_APPLICATION 模块中找不到“应用程序”
- python - 我在 python 中使用 PhotoImage 制作图像,但找不到图像
- mysql - 如何在mysql中按产品ID和最新创建日期分组?