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。
两种方法有什么区别?以及如何了解setState如何更新状态?
谢谢
答案 0 :(得分:1)
setState是异步的,因此在更新状态时您不能依赖当前状态。 请参阅this文档,尤其是讨论类似示例的部分:
这种形式的setState()也是异步的,并且在同一周期内的多个调用可能被批处理在一起。例如,如果您尝试在同一循环中多次增加项目数量,则将导致以下结果:... etc
答案 1 :(得分:1)
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
计算新值不是一个好主意。如果要基于状态中的当前值更改状态,请不要访问this.state
!
而是给setState
回调:
setState(state => ({ num: state.num + 1 })
考虑来自ReactJS docs的示例:
例如,如果您 尝试一次增加一件商品的数量 周期,将导致以下结果:
Object.assign(
previousState,
{quantity: state.quantity + 1},
{quantity: state.quantity + 1},
...
)
后续呼叫将覆盖同一呼叫中先前呼叫的值 周期,因此数量只会增加一次。如果下 状态取决于当前状态,我们建议使用更新程序 函数形式,而不是:
this.setState((state) => {
return {quantity: state.quantity + 1};
});