React基礎-生命周期

【3-2-1】

掛載階段【3】constructor / render / componentDidMount

更新階段【2】render / componentDidUpdate

卸載階段【1】componentWillUnmount

【一個特殊的生命周期】shouldComponentUpdate


react生命周期

1、constructor()

構(gòu)造器函數(shù),它的入?yún)⑹?b>props(由父組件傳遞過來的自定義屬性和children)

第一行代碼必須是 super(props),調(diào)用父類的構(gòu)造器函數(shù)

組件自有的state只能在這里定義(先定義后使用),state就是所謂的聲明式變量

四個不要

在這里不能修改props,在這里也不能用props來做運算。

在這里不要把props和state交叉賦值(運行),在React代碼邏輯,永遠要保持props和state的獨立性。

在這里不要使用this.setState()修改state

一般情況下,不要在這里寫業(yè)務邏輯,比如DOM、BOM操作等都不要在這里做。

有時候我們需要改變this指向時,可以這里做

2、componentDidMount()

相當于vue中mounted(),表示掛載階段已完成。

各種業(yè)務邏輯(DOM操作、ref操作、調(diào)接口、開定時器)等都可以在這個做。

在這里可以this.setState(),默認還是異步的。

3、shouldComponentUpdate()

這個生命周期相當于一個用于控制更新的“開關

這個生命周期只會影響更新階段,不會影響其它階段。

注意:如果你用到了這個生命周期,無論里面的邏輯多么復雜,都返回返回一個布爾值。

使用場景:舉個例子,state中有10個聲明式變量,但只有9個變量參與了視圖渲染,還有1個變量與視圖渲染沒有任何關系。當有人使用this.setState()來修改這個與視圖渲染無關的變量時,這將也會觸發(fā)render()返回新的JSX,白白地浪費了性能。所以這個生命周期是React給出的一種性能優(yōu)化方案。

這個優(yōu)化方案要考慮props和state兩重數(shù)據(jù)流對視圖渲染的影響,這個優(yōu)化方案異常復雜,所以實踐工作中幾乎沒人用。

【現(xiàn)在】React官方提供了一個 PureComponent 構(gòu)造類,徹底地解決上述這個難以解決的優(yōu)化問題

this.forceUpdate()它會繞過這個生命周期。shouldComponentUpdate對this.forceUpdate()不影響。

如果需要做優(yōu)化的state越多,這里的優(yōu)化邏輯將越復雜。如果新count != 舊count,這說明count變了

4、componentDidUpdate()

相當于vue中的updated(),表示更新階段已完成。

在當前組件中,有三種方式觸發(fā)更新階段:props變化、this.setState()、this.forceUpdate()

使用場景:this.setState()這個異步工作完成時,我們?nèi)プ隽硪患莚ender的事件。

在這里可以使用this.setState(),但必須給終止條件。(你可以想一想遞歸)

這個生命周期,是更新階段的,發(fā)生在render()之后。

5、componentWillUnmount()

相當于vue中beforeDestroy(),表示當前組件即將被銷毀

在這里一般用于清除定時器、長連接、清緩存等

在這里可以調(diào)用this.setState(),但毫無意義。

6、render()

這個生命周期,是React所有生命周期中必須要有的。

這個生命周期橫跨兩個階段,在掛載階段和更新階段都執(zhí)行。

組件初始化、this.setState時、this.forceUpdate時、props變化時,它會執(zhí)行

在更新階段,如果當前有shouldComponentUpdate并返回false時,render()將不執(zhí)行

在掛載階段,render()一定會執(zhí)行,shouldComponentUpdate不影響render()。

特別提醒:

1、在“自定義渲染方法”中不能使用this.setState()。

2、在render()內(nèi)部、return()之間,不能使用到this.setState()

3、在JSX中不能調(diào)用this.setState()方法。

render() 方法一定要返回 ReactNode,不能返回void。

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

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

  • React中的生命周期--分為三大部分 1-實例化/掛載階段 constructor() 進行構(gòu)造初始化 接收pr...
    碼楓云閱讀 213評論 0 0
  • React 生命周期很多人都了解,但通常我們所了解的都是單個組件的生命周期,但針對Hooks 組件、多個關聯(lián)組件(...
    前端js閱讀 7,314評論 3 7
  • React中組件也有生命周期,也就是說也有很多鉤子函數(shù)供我們使用, 組件的生命周期,我們會分為四個階段,初始化、運...
    野生羊腰子閱讀 1,511評論 0 0
  • 在React Native中使用組件來封裝界面模塊時,整個界面就是一個大的組件,開發(fā)過程就是不斷優(yōu)化和拆分界面組件...
    ITxiansheng閱讀 986評論 1 2
  • 在React Native中使用組件來封裝界面模塊時,整個界面就是一個大的組件,開發(fā)過程就是不斷優(yōu)化和拆分界面組件...
    朱_源浩閱讀 9,070評論 6 38

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