面試題:react生命周期


一:掛載卸載

1、constructor:

react數據的初始化,他接收2個參數,props和context。如果要使用這兩個參數,就要使用super(),否則會造成this指向錯誤。

2、componentWillMount

用在服務端渲染時使用。組件已經經歷了constructor初始化數據,但還未渲染DOM.

3、componentDidMount

組件第一次渲染完成,dom節點已生成。可以在這里請求ajax,返回數據setState后,組件會重新渲染。

4、componentWillUnMount

在此次完成組件的卸載和數據的銷毀。
可以移除 setTimeout 、setInterval、組件的監聽等。

二:更新

1、componentWillReceiveProps(nextProps)

在接收父組件改變后的props,需要重新渲染組件時使用。
接收參數nextProps
對比this.props 和 nextProps 將nextProps的state改為當前的state,頁面可以重新渲染。

2、shouldComponentUpdate(nextProps,nextState)

主要用於性能優化。
唯一控制組件重新渲染的聲明周期。由於setState之后,頁面會重新渲染,但是這里如果返回false,則會阻止渲染更新。
原因:react父組件的重新渲染會導致所有子組件也重新渲染。這時不需要子組件全部跟着重新渲染的,可以在子組件的這個聲明周期中進行判斷是否需要渲染。

3、componentWillUpdate(nextProps,nextState)

shouldComponentUpdate,返回true后,組件進入重新渲染的進程。
此時進入componentWillUpdate中,也可以同樣拿到nextProps和nextState

4、componentDidUpdate(prevProps, prevState)

組件更新完畢后,react只會在第一次初始化成功會進入componentDidMount,之后每次重新渲染都會進入到componentDidUpdate中,在這里可以拿到prevProps和prevState,也就是更新前的props和state 

三:render()

render函數會插入jsx生成dom結構,react會生成一個虛擬dom樹,在每一次組件更新的時候,react會通過diff算法比較更新前后的dom樹,比較dom后找到最小差異的dom節點,並重新渲染

  

新增加的聲明周期:

1、getDerivedStateFromProps(nextProps,nextState)

代替 componentWillReceiveProps

componentWillReceiveProps:
判斷前后兩個props是否相同,如果不同,將新的的props更新到對應的state上去。
這樣處理會 破壞 state數據的單一數據源,導致組件狀態變得不可預測,也會增加重繪次數。
getDerivedStateFromProps:
在新版本中的更新 state 與觸發回調重新分配到,getDerivedStateFromProps中觸發條件,在componentDidUpdate中進行數據的更新。使數據結構更加清晰。而且在getDerivedStateFromProps中禁止使用this.props ,強制比較nextProps和prevState的值,以確保在根據當前的props來更新state的值。

2、getSnapshotBeforeUpdate(prevProps, prevState)

代替componentWillUpdate

componentWillUpdate:
在組件更新前,讀取某個dom元素的狀態,並在componentDidUpdate中更新。

區別:
1、在react開始渲染模式后,在render階段讀取到的dom元素狀態並不總是和commit階段相同,這就導致componentDidUpdate中使用componentWillUpdate中讀取到的元素已失效。
2、getSnapShotBeforeUpdate會在最終的render之前被調用,也就是getSnapShotBeforeUpdate中讀取到的dom狀態可以保證和componentDidUpdate一至。
此生命周期返回的任何值,都作為參數傳遞給componentDidUpdate中。

  

 

 

 

 

 

 

 

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM