一:掛載卸載
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中。