組建從被建立到被銷燬的過程稱爲組件的生命週期。React
爲組件在不一樣的生命週期階段提供了不一樣的生命週期方法,可讓咱們在組件的生命週期過程當中更好的控制組件的行爲。一般生命週期咱們能夠分爲三個階段:
掛載階段 -> 更新階段 -> 卸載階段
此階段組件被建立,執行初始化,並被掛載到DOM中,完成組件第一次渲染。react
constructor
自己是ES6的class
的構造方法,組件被建立時,會首先調用組件的構造方法。這個構造方法會接受一個props參數,props是從父組件傳過來的屬性對象,若是父組件沒有傳入屬性而組件自身定義了默認屬性,那麼這個props
指向的就是組件的默認屬性。數組
並且很關鍵的是,你必須在這個方法中先調用super(props)
才能保證props
被傳入組件中,這部分具體的你們參照ES6中class
相關內容就能夠了。服務器
constructor
一般用於初始化組件的state
以及綁定事件處理函數等。函數
該方法在組件被掛載到DOM前調用,且只會被調用一次。這個方法實際上不多被用到,相關階段的處理徹底能夠放到constructor
中。性能
在這個方法中調用
this.setState
不會引發組件的從新渲染。
該方法是組件定義時惟一必要的方法(組件的其餘生命週期函數均可以忽略)。在這個方法中,根據組件的props
和state
返回一個React
元素,用於描述組件的UI,一般React
元素使用JSX
語法定義。
須要注意的是,render
並不負責組件的實際渲染工做,它只是返回了一個UI的描述,真正的渲染出頁面DOM的工做是由React
自身負責。render
是一個純函數,在這個方法中不能執行任何有‘反作用’
的操做,因此不能在render方法中調用this.setState
,這會改變組件的狀態,致使程序出現問題。優化
在組件被掛載到DOM後將會調用這個方法,且只會被調用一次。這個時候已經能夠獲取到DOM結構,由於依賴DOM節點的操做能夠放到這個方法中。這個方法一般還會用於向服務器請求數據。在這個方法中調用this.setState會引發組件的從新渲染。this
組件被掛載到DOM後,組件的props
和state
能夠引發組件更新。props
引發的組件更新,本質上是由渲染該組件的父組件引發的,也就是當父組件的render
方法被調用時,組件會發生更新過程。這個時候,組件的props
的值是否變動是由父組件來決定的,可是,不管props
是否變化,父組件render
方法每被調用一次,都會致使組件更新。spa
state引發的更新過程,是經過調用this.setState
修改組件的state
來觸發的。3d
看名稱也能夠猜到,這個方法和props
有關。這個方法只會在props引發的組件更新過程當中,纔會被調用。State
引發的組件更新並不會觸發該方法。方法的參數nextProps
是父組件傳遞給當前組件的新的props
。在前面咱們也提到過,父組件render方法的調用並不能保證傳遞給子組件的props發生變化,也就是說nextProps
不必定發生變化,由於每每咱們須要先比較nextProps
和this.props
來決定是否執行props
發生變化後的邏輯。好比根據新的props
來更新state
觸發組件的從新渲染。code
在componentWillReceiveProps
中調用setState
,只有在組件render
及其以後的方法中,this.state
指向的纔是更新後的state
。在render
以前的方法(shouldComponentUpdate
、componentWillUpdate
)中,this.state
依然指向更新前的state經過調用
setState
更新組件狀態並不會觸發componentWillReceiveProps
的調用,不然可能會進入死循環,componentWillReceiveProps
->this.setState
->componentWillReceiveProps
->this.setState
-> ……
這個方法決定組件是否繼續執行更新過程。當方法返回true時(true也是這個方法的默認返回值),組件會繼續更新過程;當方法返回false時,組件的更新過程將中止,後續的componentWillUpdate
、render
、componentDidUpdate
也不會被調用。
通常經過比較nextProps
、nextState
的組件當前的props
、state
決定這個方法的返回結果。這個方法能夠用來減小組件沒必要要的渲染,從而優化組件的性能。
這個方法在組件render調用前執行,能夠做爲組件更新發生前執行某些工做的地方,通常也較少用到。
shouldComponentUpdate
和componentWillUpdate
中都不能調用setState
,不然會引發循環調用問題,render
永遠沒法被調用,組件也就不能被更新了。
組件更新後調用,能夠做爲操做更新後的DOM的地方,這個方法的兩個參數prevProps
和prevState
表明組件更新前的props
和state
。
該過程是組件從DOM中被卸載的過程,該過程只有一個生命週期方法:componentWillUnmount
這個方法在組件被卸載前調用,能夠在這裏執行一些清理工做,好比清除組件中使用的定時器,清除componentDidMount中
手動建立的DOM元素等,以免引發內存泄露。
上面咱們簡單梳理分析了React
組件的生命週期方法的不一樣階段的執行過程,以及每一個生命週期方法的功能的做用。最後要提醒你們,只有類組件才具備生命週期方法,函數組件是沒有生命週期方法的。
參考資料:
React中文文檔《React進階之路》