react組件的生命周期

一般來說,一個組件類由 extends Component 創(chuàng)建,并且提供一個 render 方法以及其他可選的生命周期函數(shù)、組件相關(guān)的事件或方法來定義

getInitialState (es5)

初始化 this.state 的值,只在組件裝載之前 調(diào)用一次 。
如果是使用 ES6 語法,可以在構(gòu)造函數(shù) construcror 中初始化state的值。例如:

class Home extends React.Component {
  constructor(props){
  super(props);
  //初始化state
  this.state = {
    show:false
  }
}
}

getDefaultProps (es5)

該方法只在組件創(chuàng)建時 調(diào)用一次 并緩存返回的對象(即在 React.createClass 之后就會調(diào)用)。
初始化this.props的值,即在組件裝載后,緩存的結(jié)果會用來保證 父組件還沒傳入屬性的值時,訪問 this.props 的屬性,也是有值的。
因在實(shí)例初始化之前調(diào)用的,故不能使用this獲取到實(shí)例。

如果是使用 ES6 語法,可以直接定義 defaultProps 這個類屬性來初始化props

Home.defaultProps = { initialCount: 0 };

componentWillMount

在首次渲染之前調(diào)用,而且 只調(diào)用一次。
這里可以修改state,也是在 render 方法調(diào)用之前修改 state 的最后一次機(jī)會,不會導(dǎo)致重新渲染(state或者props發(fā)生改變并不會觸發(fā))。
也可以做 異步請求數(shù)據(jù)ajax/fetch(但不建議,因?yàn)镈OM還沒有渲染,個時候的一些DOM操作就會出錯)。
此處如更改state會在render()渲染時才能獲取修改后的state

render

渲染組件
這是 唯一必須 的方法:創(chuàng)建虛擬DOM

- 只能通過 this.props 和 this.state 訪問數(shù)據(jù)(不能修改)

- 可以返回 null,false 或者任何React組件

- 只能出現(xiàn)一個頂級組件,不能返回一組元素

- 不能改變組件的狀態(tài)

- 不能修改DOM的輸出

render方法返回的結(jié)果并不是真正的DOM元素,而是一個虛擬的表現(xiàn),類似于一個DOM tree的結(jié)構(gòu)的對象。react之所以效率高,就是這個原因。

componentDidMount

初始化渲染后只調(diào)用一次,這時可以獲取相應(yīng)的DOM節(jié)點(diǎn)。

這里可以掛載一些其他的插件之類的,也可以執(zhí)行異步請求;一般 建議在componentDidMount中異步請求數(shù)據(jù)

componentWillReceiveProps(nextProps)

初始化渲染不會調(diào)用,組件在接受到新的props時調(diào)用,nextProps是接受到的新的props,可以通過this.props獲取老的props。例如:當(dāng)父組件傳入新的props的時候可以在此做些簡單的處理

componentWillReceiveProps(nextProps){
    let params = this.params;
    let nextParams = nextProps.params;
 if (params.sub !== nextParams.sub){
       //簡單的邏輯處理
  }

}

shouldComponentWillUpdate

初始化渲染不會調(diào)用,接收到新的propsstate時調(diào)用

componentWillUpdate

初始化渲染不會調(diào)用,更新前調(diào)用。組件渲染前執(zhí)行,接受新的props、state或者調(diào)用forceUpdate()

componentDidUpdate

初始化渲染不會調(diào)用,更新后調(diào)用。組件每次渲染都會執(zhí)行,可以獲取相應(yīng)的DOM節(jié)點(diǎn)

componentWillUnmount

組件被卸載的時候調(diào)用。
componentDidMount 中添加的任務(wù)都需要在該方法中撤銷,如創(chuàng)建的定時器、事件監(jiān)聽器或斷開socket
一般在componentDidMount里面注冊的事件需要在這里刪除


每次使用this.setState 修改state時,會依次調(diào)用:

 * shouldComponentUpdate
 * componentWillUpdate
 * render
 * componentDidUpdate

調(diào)用setState(setState并不是一個同步的方法,可以理解為異步)后,立刻獲取的值,仍然是老值,需要在render的時候才能獲取修改后的新值;如果想setState后獲取到更新的值,可以放在回調(diào)里;比如:

this.setState({
     show:true
},function(){
     console.log(this.state.show) //true
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容