React:組件的生命周期

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

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

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

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

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

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

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

getDefaultProps

對(duì)于每個(gè)組件實(shí)例來(lái)說(shuō),這個(gè)方法只會(huì)被調(diào)用一次,該組件類(lèi)的所有后續(xù)應(yīng)用,getDefaultProps將不會(huì)再被調(diào)用,這個(gè)方法返回的對(duì)象可用于為實(shí)例設(shè)置默認(rèn)的props值。

簡(jiǎn)單例子:

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

對(duì)于組件的每個(gè)實(shí)例來(lái)說(shuō),這個(gè)方法的調(diào)用次數(shù)有且只有一次。在這個(gè)方法里,你可以初始化每個(gè)實(shí)例的state,而且可以訪問(wèn)到 this.props 。
不過(guò),與 getDefaultProps 不同的是,每次實(shí)例創(chuàng)建時(shí),getInitialState 這個(gè)方法都會(huì)被調(diào)用一次,而getDefaultPops 是對(duì)于組件類(lèi)來(lái)說(shuō)只調(diào)用一次,后續(xù)該類(lèi)的應(yīng)用都不會(huì)被調(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都會(huì)重新渲染組件,實(shí)例化后通過(guò)state更新組件。

componentWillMount


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


render


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

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


componentDidMount


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


2.存在期

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


componentWillReceiveProps


在任何時(shí)刻,組件的props都可以通過(guò)父輩組件來(lái)更改。這時(shí),這個(gè)方法會(huì)被調(diào)用,我們也將獲得更改props對(duì)象及更新state的機(jī)會(huì)。


shouldComponentUpdate


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

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


componentWillUpdate


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

注意:不可以在該方法中更新state或props,而應(yīng)該借助 componentWillReceiveProps 方法在運(yùn)行時(shí)更新state。


componentDidUpdate

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


3.銷(xiāo)毀&清理期

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


componentWillUnmount


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


總結(jié)

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



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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)