React嚴格定義了組件的生命週期,生命週期可能會經歷以下三個過程:瀏覽器
當組件第一次被渲染時,依次調用的函數:服務器
constructor函數
ES6中每一個類的構造函數,要建立一個組件類的實例,便會調用對應的構造函數
注意:this
- 並非每一個組件都須要定義本身的構造函數,無狀態的React組件每每就不須要定義構造
函數;- 一個React組件須要構造函數目的:
- 初始化state,由於組件的生命週期中任何函數均可能要訪問state,那麼整個週期中第一個被調用的構造函數即是初始化state最理想的地方;
- 綁定成員函數的this環境:
- 由於在ES6語法下,類的每一個成員函數在執行時的this並非和類實例自動綁定的;
- 而在構造函數中this就是當前組件實例,因此,爲了方便未來調用,每每在構造函數中將這個實例的特定函數綁定this爲當前類實例:code
... constructor(props){ super(props); this.onClickFunc = this.onClickFunc.bind(this); }
getInitialState和getDefaultProps
1. getInitialState函數的返回值用來初始化組件的this.state;
2. getInitialState只出如今裝載過程,也就是說一個組件的整個生命週期過程當中,這個函數只被調用一次;
3. getDefaultProps函數的返回值能夠做爲props的初始值;
4. 兩個函數都只有在使用React.createClass方法建立組件類時纔會用到:component
const Sample = React.createClass({ getInitialState: function() { return {foo: '返回值將做爲this.state的初始值'}; }, getDefaultProps: function() { return {sampleProp: '做爲props的初始值'} } })
5. React.createClass建立方法已經逐漸被Facebook官方廢棄
6. 使用ES6時,在構造函數中經過this.state賦值完成狀態初始化;經過給類屬性(注意是類屬性,而不是類的實例對象的屬性)defaultProps賦值指定的props初始值:對象
class Sample extends React.Component{ constructor (props){ super(props); this.state = {foo: '初始值'} } } Sample.defaultProps = { sampleProps: 0 }
render生命週期
componentWillMount和componentDidMount字符串
- render函數自己並不往DOM樹上渲染或者裝載內容,它只是返回一個表示JSX表示的對象(及組件實例),而後由React庫根據返回的對象決定如何渲染;
- 而React庫確定是要把全部組件返回的結果綜合起來,才能知道如何產生對應的DOM修改;
- 因此只有React庫調用全部組件的render函數以後,纔有可能完成DOM裝載,這時候纔會依調用componentDidMount函數做爲裝載的收尾。
- componentWillMount能夠在服務器和瀏覽器端被調用,而componentDidMount只能在瀏覽器端被調用(由於componentDidMount是在‘裝載’完成以後被調用,且‘裝載’是一個建立組件並放到DOM樹上的過程,而服務器端渲染經過React組件產生的只是一個純粹的字符串,並不會產生DOM樹,即在服務器端不可能完成‘裝載過程’因此沒法調用componentDidMount)
更新過程會依次調用如下生命週期函數,其中render函數和「裝載」過程同樣:
- componentWillReceiveProps
- shouldComponentUpdateget
componentWillReceiveProps(nextProps)
shouldComponentUpdate(nextProps,nextState)
componentWillUpdate和componentDidUpdate