使用過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。