關於setState的異步,隨便一搜就是一堆文章,從各類現象到海量源碼,長篇鉅製洋洋灑灑,像我這樣的新手看得雲裏霧裏,暈頭轉向。但這個問題又無比簡單,僅需理解兩點淺顯的道理,便能撥雲見日:1.同步代碼不可能異步;2.若是"異步"了,必定是執行順序發生了改變。react
componentDidMount: 該方法執行完畢後才更新,state在更新時(render)再設置爲新的值。setState後續的代碼在生命週期函數中執行,此時state還未變動,所以表現出"異步"特性。異步
同理,setState在事件中同步執行完畢,react準備更新(will),state在更新時(render)再設置爲新的值。setState後續的代碼在觸發事件時執行,順序在state變動以前。函數
注:state的合併,只能將同步的setState合併掉,兩次事件的變動沒法合併,任你點擊得再快component
react監控的只有生命週期函數和合成事件,而非setState,在這兩個方法執行前會先設置isBatchingUpdates爲true,致使state等更新完畢後再改變,所以其餘狀況下,batchedUpdates爲false,setState同步更新。一樣,state也是在更新時設爲新的值,可是setState後續的代碼也是在更新完成以後執行,所以表現出同步特性。生命週期
注:同理,Promise的構造函數內的setState,由於構造函數的同步性,當其處於1和2的狀況下時,也會呈現出"異步"事件