react的生命周期鈎子函數


首先我們先來掌握基本單詞
掌握單詞后會更好理解和記住生命周期:
constructor ------構造函數
component ------組件
will ------將要
get ------得到
default ------默認值
initial ------最初的
unsafe ------不安全的
static ------靜態的
derived ------衍生的
should ------應該
update ------更新
unmount ------取消掛載
receive ------收到

總體分為三個階段:
1.組件掛載

(1)constructor

可以理解為組件的第一個生命周期,一般會在這里初始化組件的內部狀態(state),如果在這里面要使用this則必須在super()之后,如果在這里面需要使用props,那么需要把props作為參數傳入。
在使用React.createClass()這種方式創建組件的時期,會有倆個生命周期:
getDefaultProps()
設置默認的props,也可以用defaultProps設置組件的默認屬性。
//直接使用static defaultProps = {}這種方式來創建
getInitialState()
在使用es6的class語法時是沒有這個鈎子函數的,可以直接在constructor中定義this.state。此時可以訪問this.props
// 現在這個已經直接在constructor里使用this.state = {}這種方式來創建

(2)componentWillMount ------------ 17版本即將廢除

組件將要掛載,這個生命周期基本上沒有什么用,而且react*17版本之后廢棄。
如果還想繼續使用,可以使用UNSAFE_componentWillMount來代替。
這個生命周期,是除了初始化之外,唯一一個能夠直接同步修改state的地方。

(3)static getDerivedStateFromProps

設置了這個生命周期就不能設置componentWillMount()
這是react16.3之后新增的一個生命周期,這是一個靜態方法,靜態方法沒有this所以不能使用setState,需要return一個對象,這個對象就相當於setState里面的參數。
常用於強制性的根據props來設置state

(4)render

react最重要的步驟,創建虛擬dom,進行diff算法,更新dom樹都在此進行。此時就不能更改state了。
這里是合成虛擬DOM,可以理解為,在這里實際上都還沒有真實的dom。

(5)componentDidMount ajax請求生成DOM**********

渲染真實的DOM瀏覽器,在這里才可以得到DOM。這個生命周期就是相當重要的一個生命周期,ajax請求一般都在這里進行。

2.組建更新

分為倆種情況,state改變和props改變
如果state改變,會直接進行到組件更新的第二個shouldComponentUpdate,如果是props改變,會先走componentWillReceiveProps。

(1)componentWillReceiveProps -----17版本即將廢除

16.4之前,由於在更新階段,沒有static getDeriveStateFromProps這個生命周期,如果有根據props來生成的state,就需要在這里重新設置一次。因為之前是在constructor里面根據props來初始化的state,constructor只會執行一次,所以要在componentWillReceiveProps來修正state。在新的版本里,static getDerivedStateFromProps這個生命周期不管是在裝載還是更新的時候都會觸發。因此,componentWillReceiveProps也只會工作到react17.

(2)shouldComponentUpdate 性能優化*

這個生命周期用於react的性能優化,接收倆個參數(nextProps,nextState)通常會根據這倆個參數和this.state,this.props來進行diff算法對比,根據比較的結果來return true或者false,如果return的是false,將不會再執行后面的生命周期。

(3)componentWillUpdate -----17版本即將廢除

沒什么卵用

(4)render

和mount階段一樣,生成虛擬DOM

(5)componentDidUpdate

同componentDidMount。

3.組件銷毀

(1)componentWillUnmount

組件將要銷毀,這里一般可以用來清理定時器,解綁某些事件。


免責聲明!

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



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