React常用生命周期鉤子總結(jié)

render()

render() 方法是 class 組件中唯一必須實現(xiàn)的方法。

render 被調(diào)用時,它會檢查 this.propsthis.state 的變化并返回以下類型之一:

  • React 元素。通常通過 JSX 創(chuàng)建。例如,<div /> 會被 React 渲染為 DOM 節(jié)點,<MyComponent /> 會被 React 渲染為自定義組件,無論是 <div /> 還是 <MyComponent /> 均為 React 元素。
  • 字符串或數(shù)值類型。它們在 DOM 中會被渲染為文本節(jié)點
  • 布爾類型或 null。什么都不渲染。(主要用于支持返回 test && <Child /> 的模式,其中 test 為布爾類型。)

render() 函數(shù)應(yīng)該為純函數(shù),這意味著在不修改組件 state 的情況下,每次調(diào)用時都返回相同的結(jié)果,并且它不會直接與瀏覽器交互。如需與瀏覽器進行交互,請在 componentDidMount() 或其他生命周期方法中執(zhí)行你的操作。


constructor()

如果不初始化 state 或不進行方法綁定,則不需要為 React 組件實現(xiàn)構(gòu)造函數(shù)。

在 React 組件掛載之前,會調(diào)用它的構(gòu)造函數(shù)。在為 React.Component 子類實現(xiàn)構(gòu)造函數(shù)時,應(yīng)在其他語句之前前調(diào)用 super(props)。

通常,在 React 中,構(gòu)造函數(shù)僅用于以下兩種情況:

constructor() 函數(shù)中不要調(diào)用 setState() 方法。如果你的組件需要使用內(nèi)部 state,請直接在構(gòu)造函數(shù)中為 this.state 賦值初始state

只能在構(gòu)造函數(shù)中直接為 this.state 賦值。如需在其他方法中賦值,你應(yīng)使用 this.setState()替代。

避免將 props 的值復(fù)制給 state。直接使用this.props.xxx就可以了。


componentDidMount()

componentDidMount() 會在組件插入 DOM 樹后立即調(diào)用。依賴于 DOM 節(jié)點的初始化應(yīng)該放在這里。如需通過網(wǎng)絡(luò)請求獲取數(shù)據(jù),此處是實例化請求的好地方。

這個方法是比較適合添加訂閱的地方。如果添加了訂閱,請不要忘記在 componentWillUnmount() 里取消訂閱

你可以在 componentDidMount()可以直接調(diào)用 setState()。它將觸發(fā)額外渲染re-render,但此渲染會發(fā)生在瀏覽器更新屏幕之前。如此保證了即使在 render() 兩次調(diào)用的情況下,用戶也不會看到中間狀態(tài)。


componentDidUpdate()

componentDidUpdate(prevProps, prevState, snapshot)

componentDidUpdate() 會在更新后會被立即調(diào)用。首次渲染不會執(zhí)行此方法。

當組件更新后,可以在此處對 DOM 進行操作。如果你對更新前后的 props 進行了比較,也可以選擇在此處進行網(wǎng)絡(luò)請求。

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

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


componentWillUnmount()

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

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


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

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

  • 作為一個合格的開發(fā)者,不要只滿足于編寫了可以運行的代碼。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個周閱讀 8,675評論 1 33
  • 1、什么是react React.js 是一個幫助你構(gòu)建頁面 UI 的庫。React.js 將幫助我們將界面分成了...
    谷子多閱讀 2,648評論 1 13
  • 生命周期流程圖簡單如下: 組件讓你把用戶界面分成獨立的,可重復(fù)使用的部分,并且將每個部分分開考慮。React.Co...
    Simple_Learn閱讀 1,190評論 0 0
  • 40、React 什么是React?React 是一個用于構(gòu)建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,185評論 0 1
  • 早上,迷迷糊糊中,聽到廚房里一些窸窣的聲響。 知道老媽已經(jīng)早早起床做飯了。 我已經(jīng)是個小孩子的媽了,但是在我媽面前...
    五月說話閱讀 341評論 0 1

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