setState何時同步,何時異步,為什么
答案:在React庫控制時,異步;否則同步。
示例代碼如下:
constructor(props){ super(porps); this.state = { name:"異步" } } test(){ this.setState({ name:"同步" }) alert(this.state.name) } <TouchableOpacity onPress={()=>this.test()}> <Text>Button</Text> </TouchableOpacity>
上文TouchableOpacity中,是React庫控制,此時使用setState則為異步,alert值為"異步"。
如何才能觸發同步呢?看如下代碼:
test(){ this.setState({ name:"同步" },function(){ alert(this.state.name) }) }
此時使用回調的方式,即可觸發同步,大部分開發中用到的都是React封裝的事件,比如onChange、onClick、onTouchMove等,這些事件處理程序中的setState都是異步處理的。
React是怎樣控制異步和同步的呢?
在 React 的 setState 函數實現中,會根據一個變量 isBatchingUpdates 判斷是直接更新 this.state 還是放到隊列中延時更新,而 isBatchingUpdates 默認是 false,表示 setState 會同步更新 this.state;但是,有一個函數 batchedUpdates,該函數會把 isBatchingUpdates 修改為 true,而當 React 在調用事件處理函數之前就會先調用這個 batchedUpdates將isBatchingUpdates修改為true,這樣由 React 控制的事件處理過程 setState 不會同步更新 this.state。