javascript - 反应中的setState增量和每个增量1有什么区别
问题描述
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
num: 1
}
}
componentDidMount() {
this.setState({
num: this.state.num+1
});
this.setState({
num: this.state.num+1
});
}
render() {
return (
<div>
{ this.state.num }
</div>
)
}
}
componentDidMount 中调用 setState 两次使用 +1 更新 num,但最终 num 为 2
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
num: 1
}
}
componentDidMount() {
this.setState({
num: ++this.state.num
});
this.setState({
num: ++this.state.num
});
}
render() {
return (
<div>
{ this.state.num }
</div>
)
}
}
setState 使用自增更新 num,但最终 num 为 3。</p>
这两种方法有什么区别?以及如何理解 setState 如何更新状态?
谢谢你
解决方案
setState 是异步的,它返回后 this.state 还没有改变:
this.setState({
num: this.state.num+1 // this.state.num is 1, so the value here is 2
});
this.setState({
num: this.state.num+1 // this.state.num is still 1, so the value is still 2
});
所以这和
this.setState({
num: 2
});
this.setState({
num: 2
});
this.state.num
然而,在你的第二个例子中,你正在变异
this.setState({
num: ++this.state.num // this.state.num is 2 after increment
});
this.setState({
num: ++this.state.num // this.state.num is 3 after incrementing again
});
这实际上与
this.setState({
num: 2
});
this.setState({
num: 3
});
一般来说,调用 setState 并根据this.state
. 如果要根据 state 中的当前值更改 state,请不要访问this.state
!相反,给一个回调setState
:
setState(state => ({ num: state.num + 1 })
考虑ReactJS 文档中的这个例子:
例如,如果您尝试在同一周期中多次增加项目数量,则将导致等效于:
Object.assign(
previousState,
{quantity: state.quantity + 1},
{quantity: state.quantity + 1},
...
)
后续调用将覆盖同一周期中先前调用的值,因此数量只会增加一次。如果下一个状态取决于当前状态,我们建议使用更新函数形式,而不是:
this.setState((state) => {
return {quantity: state.quantity + 1};
});
推荐阅读
- if-statement - 如何使旧状态显示?(discord.js)
- c++ - 将主要功能添加到另一个文件夹时无法访问共享库
- excel - 关闭第二个工作簿时 Excel 丢失数据
- json - JSON JsonPath -> 获取包含字符串的数组值
- java - 如何使用结果/上传的 jar 找出哪个用户运行了“mvn clean deploy”命令
- rollup - Tree Shaking 问题 - 将 preserveModules 设置为 true 的汇总
- javascript - 为什么图像没有在 Phaser 中加载?
- ssl - 将letsencrypt ssl添加到詹金斯服务器
- c++ - 关于c ++虚函数覆盖的困惑,派生类调用正确的覆盖函数但不输出正确的参数值
- regression - 计算最小二乘法时矩阵的维数问题