2017-06-12 106 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)}); 
相關問題