react生命周期詳解

概述

今天學習react時候,借編寫這篇文章加深一下對react周期加深印象


5287253-bd799f87556b5ecc副本.png

Initialization階段

constructor()

constructor方法在組件建立前被調(diào)用。
??1、在這個方法里面,應該先調(diào)用super(props),否則this.props就會未定義。
??2、這個方法的主要用途是,初始化props,state和綁定方法。
在 constructor() 函數(shù)中不要調(diào)用 setState() 方法。如果你的組件需要使用內(nèi)部 state,請直接在構(gòu)造函數(shù)中為 this.state 賦值初始 state:

constructor(props) {
  super(props);
  // 不要在這里調(diào)用 this.setState()
  this.state = { counter: 0 };
  this.handleClick = this.handleClick.bind(this);
}

Mounting階段

componentWillMount()

這個方法在render方法執(zhí)行前渲染,componentWillMount() 在掛載之前被調(diào)用。它在 render() 之前調(diào)用,因此在此方法中同步調(diào)用 setState() 不會觸發(fā)額外渲染。通常,我們建議使用 constructor() 來初始化 state。
避免在此方法中引入任何副作用或訂閱。如遇此種情況,請改用 componentDidMount()。
此方法是服務端渲染唯一會調(diào)用的生命周期函數(shù)。
此方法即將過時,項目中避免使用。

render()

當調(diào)用render的時候,組件會檢查props和state并返回下列類型中的一個:

  • react元素。
  • 字符串或者數(shù)字。
  • Portals。
  • null。(不渲染)
  • Booleans。(不渲染)
  • react.Fragment。

componentDidMount()

componentDidMount() 會在組件掛載后(插入 DOM 樹中)立即調(diào)用。依賴于 DOM 節(jié)點的初始化應該放在這里。如需通過網(wǎng)絡(luò)請求獲取數(shù)據(jù),此處是實例化請求的好地方。
這個方法是比較適合添加訂閱的地方。如果添加了訂閱,請不要忘記在 componentWillUnmount() 里取消訂閱

你可以在 componentDidMount() 里可以直接調(diào)用 setState()。它將觸發(fā)額外渲染,但此渲染會發(fā)生在瀏覽器更新屏幕之前。如此保證了即使在 render() 兩次調(diào)用的情況下,用戶也不會看到中間狀態(tài)。請謹慎使用該模式,因為它會導致性能問題。通常,你應該在 constructor() 中初始化 state。

Updation階段

shouldComponentUpdate()

shouldComponentUpdate() 會在渲染執(zhí)行之前被調(diào)用。返回值默認為 true,返回 false,則不會調(diào)用componentWillUpdate(),render(),React 可能會將 shouldComponentUpdate 視為提示而不是嚴格的指令,并且,當返回 false 時,仍可能導致組件重新渲染。
此方法,大部分情況下組件可能都不需要它,僅作為性能優(yōu)化的方式而存在,例如阻止子組件每次都渲染。

UNSAFE_componentWillUpdate()

此生命周期之前名為 componentWillUpdate,當組件收到新的 props 或 state 時,會在渲染之前調(diào)用 UNSAFE_componentWillUpdate()。使用此作為在更新發(fā)生之前執(zhí)行準備更新的機會。初始渲染不會調(diào)用此方法.
此方法即將過時,項目中避免使用。

componentDidUpdate()

componentDidUpdate(prevProps, prevState, snapshot)

componentDidUpdate() 會在更新后會被立即調(diào)用。首次渲染不會執(zhí)行此方法。
當組件更新后,可以在此處對 DOM 進行操作。如果你對更新前后的 props 進行了比較,也可以選擇在此處進行網(wǎng)絡(luò)請求。(例如,當 props 未發(fā)生變化時,則不會執(zhí)行網(wǎng)絡(luò)請求)。

componentDidUpdate(prevProps) {
  // 典型用法(不要忘記比較 props):
  if (this.props.userID !== prevProps.userID) {
    this.fetchData(this.props.userID);
  }
}

你也可以在 componentDidUpdate() 中直接調(diào)用 setState(),但請注意它必須被包裹在一個條件語件里,正如上述的例子那樣進行處理,否則會導致死循環(huán)。

Unmounting

componentWillUnmount()

componentWillUnmount() 會在組件卸載及銷毀之前直接調(diào)用。在此方法中執(zhí)行必要的清理操作,例如,清除 timer,取消網(wǎng)絡(luò)請求或清除在 componentDidMount() 中創(chuàng)建的訂閱等。

componentWillUnmount() 中不應調(diào)用 setState(),因為該組件將永遠不會重新渲染。組件實例卸載后,將永遠不會再掛載它。

總結(jié)

簡單記錄一下react的生命周期,有些過時的就沒做太多介紹,其實官網(wǎng)介紹的還是很清晰的,大家可以參考官網(wǎng)熟悉生命周期。

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

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

  • Each component has several "lifecycle methods" that you c...
    暮落晨曦閱讀 522評論 0 0
  • getDefaultProps 執(zhí)行過一次后,被創(chuàng)建的類會有緩存,映射的值會存在this.props,前提是這個p...
    G_whk閱讀 2,285評論 0 0
  • 1 React生命周期流程 調(diào)用流程可以參看上圖。分為實例化,存在期和銷毀三個不同階段。介紹生命周期流程的文章很多...
    Dabao123閱讀 392評論 0 1
  • 這一部分內(nèi)容一直一知半解,最近發(fā)現(xiàn)一篇文章,非常好的解釋了生命周期的問題,留存在這里,以備后查! 簡介 一個rea...
    春木橙云閱讀 1,028評論 0 5
  • 上面的這幅圖已經(jīng)很好地詮釋一個react組件的生命周期,所以認真看圖!認真看圖!認真看圖! 一、getDefaul...
    好大一顆星閱讀 356評論 0 2

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