1. 程式人生 > >React生命週期函式的使用

React生命週期函式的使用

1.constructor():建構函式
執行時間:元件被載入前最先呼叫,並且僅呼叫一次
作用:定義狀態機變數
注意:第一個語句必須是super(props),正確定義狀態機程式碼如下
constructor(props) {
super(props);
this.state = {
content:null,
}
}
如果第一句不使用super(),錯誤程式碼及報錯如下
‘this’ is not allowed before super();

2.componentWillMount()
執行時間:元件初始渲染(render()被呼叫前)前呼叫,並且僅呼叫一次
作用:如果在這個函式中呼叫setState改變某些狀態機,react會等待setState完成後再渲染元件
注意:子元件也有componentWillMount函式,在父元件的該函式呼叫後再被呼叫

3.render()
執行時間:componentWillMount之後,componentDidMount之前,
作用:渲染掛載元件
觸發條件:(1)初始化載入頁面(2)狀態機改變setState ( 3 ) 接收到新的props(父元件更新)
注意:元件所必不可少的核心函式;不能在該函式中修改狀態機state

4.componentDidMount()
執行時間:render之後被呼叫,並且僅呼叫一次
作用:渲染掛載元件;可以使用refs(備註:React支援一個特殊的屬性,你可以將這個屬性加在任何通過render()返回的元件中。這也就是說對render()返回的元件進行一個標記,可以方便的定位的這個元件例項。)
注意:子元件也有該函式,在父元件的該函式呼叫前被呼叫;如果在該函式中修改某些狀態機state,會重新渲染render元件,所以有些元件為減少渲染次數,可以將某些修改狀態機的操作放在componentWillMount函式中;如果需要再程式啟動顯示初始化頁面後從網路獲取資料,可以將網路請求程式碼放在該函式中

5.componentWillReceiveProps(nextProps)
執行時間:元件渲染後,當元件接收到新的props時被呼叫;這個函式接收一個object引數(新的props);props是父元件傳遞給子元件的。父元件發生render的時候子元件就會呼叫
作用:渲染掛載元件;可以使用refs(備註:React支援一個特殊的屬性,你可以將這個屬性加在任何通過render()返回的元件中。這也就是說對render()返回的元件進行一個標記,可以方便的定位的這個元件例項。)
注意:react初次渲染時,該函式並不會被觸發,因此有時該函式需要和componentWillMount或componentDidMount組合使用;使用該函式一定要加nextProps引數,首次使用瞭解的可以先列印結果(console.log(nextProps))

6.shouldComponentUpdate(nextProps, nextState)

執行時間:元件掛載後(即執行完render),接收到新的state或props時被呼叫,即每次執行setstate都會執行該函式,來判斷是否重新render元件,預設返回true;接收兩個引數:第一個是心的props,第二個是新的state。
作用:如果有些變化不需要重新render元件,可以在該函式中阻攔
注意:該方法在初始化渲染的時候不會呼叫,在使用 forceUpdate 方法的時候也不會

7.componentWillUpdate()
執行時間:在接收到新的props 或者 state,重新渲染 之前立刻呼叫,在初始化渲染的時候該方法不會被呼叫
作用:為即將發生的重新渲染做一些準備工作
注意:不能再該函式中通過this.setstate再次改變狀態機,如果需要,則在componentWillReceiveProps函式中改變

8.componentDidUpdate()
執行時間:重新渲染後呼叫,在初始化渲染的時候該方法不會被呼叫
作用:使用該方法可以在元件更新之後操作DOM 元素

9.componentWillUnmount()
執行時間:元件被解除安裝前呼叫,
作用:在該方法中執行任何必要的清理,比如無效的定時器,或者清除在 componentDidMount 中建立的 DOM 元素

10.特別注意
當一個頁面中存在子父元件時,要注意componentWillMount和componentDidMount的使用,如果需要先載入父元件(獲取網路資料),父元件傳值給子元件,再載入子元件(獲取網路資料),那麼不能同時在子父元件中使用componentDidMount獲取網路資料,因為會先執行子元件的componentDidMount,會由於未得到父元件的傳值而報錯;解決方案:(1)父元件:componentWillMount,子元件:componentDidMount;(2)父元件:componentWillMount,子元件:componentWillMount;
當一個頁面中如要實現左右聯動效果,(比如:a頁面中包含b1(左)和b2(右)頁面,單擊b1中的知識點,b2頁面內容對應變化,b1向b2通過redux傳參,b2首次通過 componentDidMount接收,後來通過componentWillReceiveProps接收)