2017-06-12 110 views
0

我在调用父级函数open()props的子组件中有一个函数open(),它可以连续多次。React的setState何时更改状态

父功能包含此行

this.setState({numOpen: (++this.state.numOpen)}); 

这条线的工作,并在每个增量更新状态。

但在此之前,该行

this.setState({numOpen: (this.state.numOpen + 1)}); 

跳过数个增量,并打破了计划。

setState是否被异步调用?如果不是,可能是什么原因呢?

+1

检查:https://stackoverflow.com/questions/42593202/why-calling-setstate-method-doesnt-mutate-该状态立即 –

+0

这是一篇好文章https://medium.com/@mweststrate/3-reasons-why-i-stopped-using-react-setstate-ab73fc67a42e –

+1

谢谢@MayankShukla回答了我的问题 –

回答

3

正如@MayankShukla重复的答案表明,setState is asynchronous

但是添加的解释和修正方法

在下面的情况:

this.setState({numOpen: (++this.state.numOpen)}); 

您直接变异的状态,然后设置的价值,因此它的工作,但不是正确的方式去做

在第二种情况下

this.setState({numOpen: (this.state.numOpen + 1)}); 

setState的值作为你体验它会导致意外的行为当前状态添加由于其异步特性。

做正确的方法是使用prevState回调方法

this.setState((prevState) => ({numOpen: (prevState.numOpen + 1)}); 
相关问题