React:組件的生命周期

2018-06-19 10:55 更新
基于React組件的生命周期,我畫了一個圖:

如上圖,React組件的生命周期分為三個階段:
  • 創(chuàng)建時,也就是實例化,在這個階段,新的組件完成了被創(chuàng)建、首次渲染初始化。
  • 存在期,也就是活動期,在這個階段,組件已經(jīng)渲染好,可以與用戶進行交互。通常是通過一次鼠標點擊、手指點按或鍵盤事件來觸發(fā)一個事件處理器。
  • 銷毀&清理期,在這個階段,每當React使用完一個組件,這個組件就會從DOM中卸載,隨后就會被銷毀。

在組件的整個生命周期中,隨著該組件的props或者state發(fā)生改變,它的DOM表現(xiàn)也將有相應的變化。

一個組件就是一個狀態(tài)機:對于特定的輸入,它總會返回一致的輸出。

生命周期回調(diào)函數(shù)

下面我們具體來看看各個回調(diào)函數(shù)的含義和作用。

1.實例化
當每個新的組件被創(chuàng)建、首次渲染時,有一系列的方法可以用來為其做準備工作,如下所示:

getDefaultProps

對于每個組件實例來說,這個方法只會被調(diào)用一次,該組件類的所有后續(xù)應用,getDefaultProps將不會再被調(diào)用,這個方法返回的對象可用于為實例設置默認的props值。

簡單例子:

var Card=React.createClass({

  getDefaultProps:function(){

    return {

      title:'頭部',

      content:'內(nèi)容區(qū)'

    }

  },

  render:function(){

    return (

      <div><p>{this.props.title}</p><p>{this.props.content}</p></div>

    )

  }

});

ReactDOM.render(

  <Card/>,

  document.body

);


getInitialState

對于組件的每個實例來說,這個方法的調(diào)用次數(shù)有且只有一次。在這個方法里,你可以初始化每個實例的state,而且可以訪問到 this.props 。
不過,與 getDefaultProps 不同的是,每次實例創(chuàng)建時,getInitialState 這個方法都會被調(diào)用一次,而getDefaultPops 是對于組件類來說只調(diào)用一次,后續(xù)該類的應用都不會被調(diào)用。

var MyButton=React.createClass({

  getInitialState:function(){

    return {isFriend:false}

  },

  handleClick:function(event){

    this.setState({isFriend:!this.state.isFriend});

  },

  render:function(){

    var friend=this.state.isFriend ? '添加好友' : '刪除好友';

    return (

      <div>

        <button onClick={this.handleClick}>{friend}</button>

      </div>

    );

  }

});


ReactDOM.render(

  <MyButton/>,

  document.body

);

每次修改state,React都會重新渲染組件,實例化后通過state更新組件。

componentWillMount


該方法會在完成渲染之前被調(diào)用,這也是在render方法調(diào)用前可以修改state的最后一次機會。


render


該方法會創(chuàng)建一個虛擬DOM,用來表示組件的輸出。對于一個組件來說,render是唯一一個必需的方法,并且有特定的規(guī)則。render方法需要滿足下面幾點:

  • 只能通過 this.props this.state 訪問數(shù)據(jù)。
  • 可以返回null、false或者任何React組件。
  • 只能出現(xiàn)一個頂級組件(不能返回一組元素)。
  • 必需純凈,意味著不能改變組件的狀態(tài)或者修改DOM的輸出。
render方法返回的結(jié)果不是真正的DOM,而是一個虛擬的表現(xiàn),React隨后會把它和真實的DOM做對比,來判斷是否有必要做出修改。


componentDidMount


在render方法成功調(diào)用并且真實的DOM已經(jīng)被渲染,你可以在這個方法內(nèi)部通過 this.getDOMNode() 方法訪問到它。


2.存在期

這個階段,組件已經(jīng)渲染好并且用戶可以與它進行交互。通常是通過一次鼠標點擊、手指點按或鍵盤事件來觸發(fā)一個事件處理器。


componentWillReceiveProps


在任何時刻,組件的props都可以通過父輩組件來更改。這時,這個方法會被調(diào)用,我們也將獲得更改props對象及更新state的機會。


shouldComponentUpdate


如果你確定某個組件或其任何子組件不需要渲染新的props或state,可以通過在這個方法里通過返回 false 來阻止組件的重新渲染,返回 false 則不會執(zhí)行 render 以及后面的 componentWillUpdate,componentDidUpdate 方法。

該方法是非必需的,并且大多數(shù)情況下沒必要在開發(fā)中使用。


componentWillUpdate


和componentWillMount方法類似,組件會在接收到新的props或state進行渲染之前,調(diào)用此方法。

注意:不可以在該方法中更新state或props,而應該借助 componentWillReceiveProps 方法在運行時更新state。


componentDidUpdate

這個方法和 componentDidMount 類似,在組件重新被渲染之后,此方法會被調(diào)用??梢栽谶@里訪問并修改 DOM。


3.銷毀&清理期

在此階段,只有一個方法會被調(diào)用,完成所有的清理和銷毀工作。


componentWillUnmount


每當React使用完一個組件,這個組件必須從 DOM 中卸載后被銷毀,此時 componentWillUnmout 會被執(zhí)行,完成所有的清理和銷毀工作,在 conponentDidMount 中添加的任務都需要再該方法中撤銷,如創(chuàng)建的定時器或事件監(jiān)聽器。


總結(jié)

React生命周期方法提供了精心設計的鉤子函數(shù),會伴隨組件的整個生命周期。和狀態(tài)機類型,每個組件都被設計成了能夠在整個生命周期中輸出穩(wěn)定、語義化的標簽。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號