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。
