React | setState,你到底想怎麼樣?!

使用過React的小夥伴們,面試中經常會被問到SetState。

各種角度來探測你對setState的理解,認知!有時候可能面試緊張到不知所云,有時候可能壓根兒不知道面試官想考你什麼,總體來說,還是對setState沒有駕輕就熟玩轉自如的程度(本着從自身出發找問題的原則纔會進步,畢竟。。。面試機會錯過就很難補救了)

結合面試問題,對setState做一個闡述~

1.setState()之後發生了什麼?

先盜一張常見的解析圖
在這裏插入圖片描述
在React的setState函數實現中,會根據一個變量 isBatchingUpdates 判斷是直接更新 this.state 還是放到隊列 中。isBatchingUpdates 變量默認是false,也就表示setState會同步更新this.state,但是有一個函數batchedUpdates會把isBatchingUpdates修改爲true,而當React在調用事件處理函數之前就會調用這個batchedUpdates,造成的後果,就是由React控制的事件處理過程setState不會同步更新this.state。

總結:由 React 控制的事件處理過程 setState 不會同步更新 this.state!
也就是說,在 React 控制之外的情況, setState 會同步更新 this.state!

2.具體生命週期函數中執行setState會發生什麼?

無意義使用:componentWillMount(state會合併到初始this.state中),componentWillUnmount(組件卸載改變state無意義);
有條件使用:componentDidUpdate(更新完再次觸發某條件進行再更新,需控制條件);
禁止使用:componentWillUpdate,shouldComponentUpdate;(更新未完成狀態下持續觸發更新會導致頁面一直嵌套在更新邏輯中,崩潰)
正常使用:componentWIllReceiveProps(合併state,等render時統一更新),componentDidMount(正常觸發更新流程)。

3.componentDidMount中setState後直接console出this.state的結果如何?

因爲此時isBatchingUpdates處於true狀態下,所以setState只是收集合並state,當前打印的還是未改變的this.state
但是,如果是像原生事件(如addEventListener)或setTimeout、setInterval這樣的異步執行後的setState將會直接更新this.state。此時打印的this.state將會輸出更新後的state。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章