首先我們先來掌握基本單詞
掌握單詞后會更好理解和記住生命周期:
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
組件將要銷毀,這里一般可以用來清理定時器,解綁某些事件。