React新生命周期

首先嫌术,React生命周期分為三個(gè)階段:掛載烫扼、渲染和卸載曙求。由三種不同的形式組成:render渲染、props改變和state改變映企。由兩種過程組成:掛載卸載過程圆到、更新過程。

下面是React16.x版本之前的生命周期

舊生命周期

16.x之前的生命周期

1.掛載卸載過程

1.1.constructor()

當(dāng)組件被實(shí)例化之后卑吭,即使不手寫構(gòu)造函數(shù)芽淡,react會(huì)自動(dòng)創(chuàng)建并執(zhí)行構(gòu)造函數(shù),并且構(gòu)造函數(shù)是最先執(zhí)行的豆赏。如果手寫了構(gòu)造函數(shù)挣菲,就必須手動(dòng)調(diào)用父類的構(gòu)造函數(shù)來實(shí)例化子類,否則會(huì)導(dǎo)致this指向錯(cuò)誤掷邦。手寫構(gòu)造函數(shù)的目的就是為了給父類也就是this添加屬性白胀,即使不添加任何屬性,react也會(huì)自動(dòng)創(chuàng)建state抚岗,只不過此時(shí)的state為null

1.2.componentWillMount()

此生命周期函數(shù)代表組件已經(jīng)經(jīng)歷了constructor()初始化數(shù)據(jù)之后或杠,但是組件未掛載,也就是還未渲染DOM 的時(shí)候宣蔚。

1.3.componentDidMount()

此生命周期函數(shù)代表組件已經(jīng)被掛載完成向抢,DOM節(jié)點(diǎn)已經(jīng)渲染完成,可以在此階段請(qǐng)求數(shù)據(jù)接口胚委,返回?cái)?shù)據(jù)之后會(huì)重新將數(shù)據(jù)渲染到組件中

1.4.componentWillUnmount ()

此過程完成組件的卸載與數(shù)據(jù)的銷毀

2.更新過程

2.1.componentWillReceiveProps (nextProps)

父組件中改變了props傳值時(shí)觸發(fā)的函數(shù), 但是此函數(shù)觸發(fā)有條件: 一挟鸠、組件初次加載時(shí)不調(diào)用此函數(shù) 二、當(dāng)組件接受了新的props時(shí)才調(diào)用此函數(shù) 三亩冬、當(dāng)父組件進(jìn)行更新以及父組件重新render(不管父組件的狀態(tài)有沒有改變)被調(diào)用后執(zhí)行

2.2.shouldComponentUpdate(nextProps,nextState)

此函數(shù)表示組件接收到新的props或者state時(shí)調(diào)用艘希,需要注意的是,初次渲染此函數(shù)不會(huì)執(zhí)行硅急。并且此函數(shù)返回bool值覆享,返回值為true時(shí),就會(huì)更新dom(使用diff算法更新),當(dāng)返回值為false時(shí)就會(huì)阻止更新

此生命周期函數(shù)可以起到性能優(yōu)化的作用营袜,因?yàn)閞eact父組件的重新渲染會(huì)導(dǎo)致其所有子組件的重新渲染撒顿,這個(gè)時(shí)候其實(shí)我們是不需要所有子組件都跟著重新渲染的,因此需要在子組件的該生命周期中做判斷

2.3.componentWillUpdate (nextProps,nextState)

此函數(shù)表示組件加載時(shí)不調(diào)用连茧,只有在組件將要更新時(shí)才調(diào)用核蘸,此時(shí)可以修改state

2.4.render()

react最重要的步驟,創(chuàng)建虛擬dom啸驯,進(jìn)行diff算法客扎,更新dom樹都在此進(jìn)行

2.5.componentDidUpdate(prevProps,prevState)

此函數(shù)表示組件數(shù)據(jù)更新已經(jīng)完成,但是組件加載時(shí)不調(diào)用,組件更新完成后調(diào)用罚斗,需要注意的是此函數(shù)在render后執(zhí)行

新生命周期

  • React生命周期新引入了兩個(gè)生命周期函數(shù):getDerivedStateFromProps徙鱼、getSnapShotBeforeUpdate,代替在17.x版本中會(huì)廢棄的生命周期方法:componentWillMount()针姿、componentWillReceiveProps()袱吆、componentWillUpdate()。16.x中新增UNSAFE前綴為別名的三個(gè)函數(shù)UNSAFE_componentWillMount()距淫、UNSAFE_componentWillReceiveProps()绞绒、UNSAFE_componentWillUpdate(),并在17.x版本中會(huì)保留 UNSAFE前綴為別名的三個(gè)函數(shù)

  • getDerivedStateFromProps()無論是Mounting還是Updating榕暇,也無論是因?yàn)槭裁匆鸬腢pdating蓬衡,全部都會(huì)被調(diào)用

  • getSnapshotBeforeUpdate()被調(diào)用于render之后,可以讀取但無法使用DOM的時(shí)候彤枢。它使您的組件可以在可能更改之前從DOM捕獲一些信息(例如滾動(dòng)位置)狰晚。此生命周期返回的任何值都將作為參數(shù)傳遞給componentDidUpdate()

結(jié)合實(shí)例可以更直觀的理解react新生命周期

import React, { Component } from 'react'

export default class NewReactComponent extends Component {
    constructor(props) {
        super(props)
        // getDefaultProps:接收初始props
        // getInitialState:初始化state
        // 當(dāng)組件被實(shí)例化之后,即使不手寫構(gòu)造函數(shù)缴啡,react會(huì)自動(dòng)創(chuàng)建并執(zhí)行構(gòu)造函數(shù)壁晒,并且構(gòu)造函數(shù)是最先執(zhí)行的
        // 如果手寫了構(gòu)造函數(shù),就必須手動(dòng)調(diào)用父類的構(gòu)造函數(shù)來實(shí)例化子類业栅,否則會(huì)導(dǎo)致this指向錯(cuò)誤
        // 手寫構(gòu)造函數(shù)的目的就是為了給父類也就是this添加屬性秒咐,即使不添加任何屬性,react也會(huì)自動(dòng)創(chuàng)建state碘裕,只不過此時(shí)的state為null
    }
    state = {
        age:18
    }
    static getDerivedStateFromProps=(props, state)=> {
        // 組件掛載必須要經(jīng)歷的生命周期
        // 組件每次被rerender的時(shí)候反镇,包括在組件構(gòu)建之后(虛擬dom之后,實(shí)際dom掛載之前)娘汞,每次獲取新的props或state之后歹茶;
        // 每次接收新的props之后都會(huì)返回一個(gè)對(duì)象作為新的state,返回null則說明不需要更新state
        // 此函數(shù)是一個(gè)靜態(tài)函數(shù)你弦,所以函數(shù)體內(nèi)不能訪問this惊豺,輸出完全由輸入決定
        console.log('static getDerivedStateFromProps(props, state)')
        console.log(props)
        console.log(state)
        return state
    }
    componentDidCatch(error, info) {
        // 獲取到j(luò)avascript錯(cuò)誤

    }
    changeState=()=>{
        this.setState({
            age:22
        })
    }
    render() {
        const {age} = this.state
        const {name} = this.props
        return (
            <>
                <h4>新生命周期</h4>
                <p>props值:name:{name},age:{age}</p>
                <button onClick={this.changeState}>change state</button>
            </>
        )
    }
    componentDidMount() { 
        // 掛載后調(diào)用且只調(diào)用一次
        console.log('componentDidMount')
    }

    shouldComponentUpdate(nextProps, nextState) {
        // nextProps和nextProps的含義就是字面量的含義,代表更新之后的狀態(tài)
        // 組件Props或者state改變時(shí)觸發(fā)禽作,true:更新尸昧,false:不更新
        console.log('shouldComponentUpdate')
        console.log(nextProps)
        console.log(nextState)
        return true
    }
    getSnapshotBeforeUpdate(prevProps, prevState) {
        // 組件更新前觸發(fā)
        // 調(diào)用順序與這個(gè)例子的順序是一樣的
        console.log('getSnapshotBeforeUpdate')
        return 'ok'
    }
    componentDidUpdate() {
        // 組件更新后觸發(fā)
        console.log('componentDidUpdate')
    }

    componentWillUnmount() {
        // 組件卸載時(shí)觸發(fā)

    }
}

掛載

當(dāng)組件實(shí)例被創(chuàng)建并插入 DOM 中時(shí),其生命周期調(diào)用順序如下:

更新

當(dāng)組件的 props 或 state 發(fā)生變化時(shí)會(huì)觸發(fā)更新烹俗。組件更新的生命周期調(diào)用順序如下:

卸載

當(dāng)組件從 DOM 中移除時(shí)會(huì)調(diào)用如下方法:

錯(cuò)誤處理

當(dāng)渲染過程,生命周期幢妄,或子組件的構(gòu)造函數(shù)中拋出錯(cuò)誤時(shí)兔仰,會(huì)調(diào)用如下方法:

參考資料:
https://react.docschina.org/docs/react-component.html#static-getderivedstatefromerror
https://segmentfault.com/a/1190000016617400?utm_source=tag-newest

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蕉鸳,隨后出現(xiàn)的幾起案子乎赴,更是在濱河造成了極大的恐慌,老刑警劉巖潮尝,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榕吼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡勉失,警方通過查閱死者的電腦和手機(jī)羹蚣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乱凿,“玉大人度宦,你說我怎么就攤上這事「娼常” “怎么了戈抄?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長后专。 經(jīng)常有香客問我划鸽,道長,這世上最難降的妖魔是什么戚哎? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任裸诽,我火速辦了婚禮,結(jié)果婚禮上型凳,老公的妹妹穿的比我還像新娘丈冬。我一直安慰自己,他們只是感情好甘畅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布埂蕊。 她就那樣靜靜地躺著,像睡著了一般疏唾。 火紅的嫁衣襯著肌膚如雪蓄氧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天槐脏,我揣著相機(jī)與錄音喉童,去河邊找鬼。 笑死顿天,一個(gè)胖子當(dāng)著我的面吹牛堂氯,可吹牛的內(nèi)容都是我干的蔑担。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咽白,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼啤握!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起局扶,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤恨统,失蹤者是張志新(化名)和其女友劉穎叁扫,沒想到半個(gè)月后三妈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莫绣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年畴蒲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片对室。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡模燥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掩宜,到底是詐尸還是另有隱情蔫骂,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布牺汤,位于F島的核電站辽旋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏檐迟。R本人自食惡果不足惜补胚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望追迟。 院中可真熱鬧溶其,春花似錦、人聲如沸敦间。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廓块。三九已至金闽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剿骨,已是汗流浹背代芜。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浓利,地道東北人挤庇。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓钞速,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嫡秕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渴语,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354