react學習--生命週期
生命週期的重要性,對於學習框架的重要性,就不多說了,下面主要講一下react的生命週期中的這些鉤子函式的基本用法。
話不多說,先上圖:
react元件的構造
import React,{ Component } from 'react';//因為編譯時要用到React,所以必須要引入 class Demo extends Component { constructor(props,context) { super(props,context)//有constructor必須要supper,防止this報錯 this.state = { //定義元件的狀態state } } componentWillMount () { } componentDidMount () { } componentWillReceiveProps (nextProps) { } shouldComponentUpdate (nextProps,nextState) {//必須要有返回值 } componentWillUpdate (nextProps,nextState) { } componentDidUpdate (prevProps,prevState) { } render () { return (//最好加上()防止編譯時遇到;自動插入的bug <div></div> ) } componentWillUnmount () { } } export default Demo;
初始化(掛載)階段
1.constructor(props,context)
接受父元件傳過來的屬性,並且可以初始化自己的state,構造器寫了就要supper,防止this指向錯誤。
拓展:(在ES6的類中,每一個類都有一個contructor(構造器),當子類去繼承父類的時候,父類的constructor需要執行一下,為子類去繼承constructor中的一些東西,如果子類自己沒有寫constructor,預設的會生成一個constructor並且在其中就會執行弗雷的constructor,執行的方法就是super(),因為子類中的super就是父類的constructor
如果子類自己編寫了constructor,那麼就需要子類自己去super一次, 否則,子類的this將不被初始化,此時,子類的constructor就可以接收到外界傳入的props,但是this上訪問不到props,如果在constructor中需要使用到this.props,那麼就必須在super中傳入props,父類構造器就會為子類的this上掛載props)
2.componentWillMount()
元件將要掛載
- 元件剛剛經過了constructor,資料的初始化完成
- 元件沒有render,dom還沒有渲染
3.render()
插入jxs構成的dom結構(React會生成虛擬dom,然後利用diff演算法進行對比,然後將改變的dom進行渲染嗎,提高效能),render 函式並不做實際的渲染動作,它只是返回一個JSX描述的結構,最終由React來操作渲染過程,React會渲染render函式return的東西,如果return false 或者 null,就等於告訴React,不渲染任何東西。
4.componentDidMount()
元件已經渲染完成,dom節點生成,元件的資料來源,通常是通過 Ajax 請求從伺服器獲取,可以使用
componentDidMount
方法設定 Ajax 請求,等到請求成功,再用this.setState
方法重新渲染 UI,至此,初始化階段完成
更新(執行中)階段
1.componentWillReceiveProps(nextprops)
當前元件接受父元件的改變,重新經渲染元件時,接收一個nextprops(對比this.props和nextprops,然後setState當前元件的state,然後進行元件的重新渲染)引數。(nextprops為最新的props)
2.shouldComponentUpdate()
當元件state改變和componentWillReceiveProps(nextprops)後執行,react唯一用於元件重新渲染的生命週期(react中,當父元件的重新渲染會引起子元件的重新渲染,可以在該生命週期中進行判斷,如return false 以阻止元件的更新,提高效能)。該生命週期一旦寫在程式碼中,必須返回布林值,return true或者false,程式碼才會繼續執行,否則會報warning。
3.componentWillUpdate()
元件將要重新渲染
4.render()
(上文已將講過)
5.componentDidUpdate(prevprops,prevstate)
元件更新完成後進入該生命週期,類似於初始化階段的componentDidMount(componentDidMount只會在第一次初始化完成後進入),引數中prevprops和prevsstate為元件更新前的props和state。
銷燬(解除安裝)階段
componentWillUnmount()
解除元件中的事件繫結(如onscroll),和一些定時器函式(如setTimeout和setInterval),和vue的銷燬階段類似。
小結:學習過react後,你會感受到react的靈活性,可以和vue對比學習,關於vue的生命週期,可參考我的另一篇部落格