React生命周期

react 生命周期

生命周期圖

生命周期經(jīng)歷三個(gè)過程

  • 裝載過程(mount), 也就是把組件第一次在DOM樹中渲染的過程
  • 更新過程(updata), 當(dāng)組件被重新渲染的過程
  • 卸載過程(Unmount), 組件充DOM中刪除的過程

三種不同的過程简烤,React庫(kù)會(huì)一次調(diào)用組件的一些成員函數(shù)截型,即生命周期鉤子

裝載過程中的生命周期鉤子

constructor
getinitialState
getDefaultProps
componentWillMount
render
componentDidMount

getinitialState、getDefaultPropsReact.createClass創(chuàng)建組件時(shí)用到的生命周期函數(shù)阱当,在高版本的React中已經(jīng)放棄這種方法憨栽,所以這次就不進(jìn)行展示猾昆;

constructor

在面向?qū)ο缶幊讨斜鄹郏悾╟lass)是對(duì)象(object)的模板劳景,定義了同一組對(duì)象(又稱"實(shí)例")共有的屬性和方法。

Javascript語言不支持"類"柄沮,但是可以用一些變通的方法回梧,模擬出"類"。

阮一峰---js類

阮一峰---ES6 > Class

constructor ES6中每個(gè)類的構(gòu)造函數(shù)铡溪,并不是每個(gè)組件都需要定義自己的構(gòu)造函數(shù)漂辐,無狀態(tài)的React組件往往不需要定義構(gòu)造函數(shù)泪喊,一個(gè)React組件需要構(gòu)造函數(shù)棕硫,往往是為了下面的目的

  • 初始化state,因?yàn)榻M件生命周期中任何函數(shù)都可以訪問state,那么整個(gè)生命周期中第一個(gè)被調(diào)用構(gòu)造函數(shù)自然是初始化state最理想的地方
  • 綁定成員函數(shù)的this

在ES6語法下袒啼,類的每個(gè)成員函數(shù)在執(zhí)行時(shí)this應(yīng)不是和類實(shí)例自動(dòng)綁定的哈扮,而是在構(gòu)造函數(shù)中,this就是當(dāng)前組件實(shí)例蚓再,所以為了方便將來的調(diào)用滑肉,往往在構(gòu)造函數(shù)中將這個(gè)實(shí)例的特定函數(shù)綁定this為當(dāng)前實(shí)例

    this.count = this.count.bind(this)

render

render 函數(shù)無疑是React組件中最重要的函數(shù),一個(gè)React組件可以忽略其他所有函數(shù)都不實(shí)現(xiàn)摘仅,但是一定要實(shí)現(xiàn)render函數(shù)靶庙,因?yàn)镽eact組件的父類React.Component類對(duì)除了render之外的生命周期都有默認(rèn)實(shí)現(xiàn)

render 函數(shù)并不做實(shí)際的渲染動(dòng)作送滞,它返回一個(gè)JSX的描述的結(jié)構(gòu)鲸阻,最容由React來操作渲染過程

某些特殊組件的作用不是渲染潔面,或者蝗砾,組件在某些情況下沒有什么內(nèi)容取進(jìn)行更新矾端,那么讓render函數(shù)返回一個(gè)null或者false掏击,等于告訴React,這次組件不需要渲染任何DOM元素

注意: render 函數(shù)應(yīng)是一個(gè)純函數(shù),完全根據(jù)this.statethis.props 來決定返回的結(jié)果秩铆,而且不要產(chǎn)生任何副作用砚亭。在render函數(shù)中取調(diào)用this.setState毫無疑問是錯(cuò)誤的,因?yàn)橐粋€(gè)純函數(shù)不應(yīng)該引起狀態(tài)的改變

componentWillMoun和componentDidMount

在裝載過程中,componentWillMount會(huì)在調(diào)用render函數(shù)前被調(diào)用捅膘,componentDidMount則會(huì)在調(diào)用render函數(shù)后被調(diào)用添祸,正好分別來做render前后必備的工作;

componentWillMount 放生在"將要裝載"的時(shí)候;這個(gè)時(shí)候沒有任何渲染出來的結(jié)果寻仗,即使調(diào)用this.setState修改狀態(tài)也不會(huì)引發(fā)重新繪制膝捞,因?yàn)橐磺卸纪砹耍谶@個(gè)時(shí)候可以做的事情都可以放到constructor中愧沟,可以認(rèn)為這個(gè)函數(shù)存在的主要目的是和componentDidMount對(duì)稱蔬咬;

componentDidMount 調(diào)用在render函數(shù)被調(diào)用完之后,componentDidMount被調(diào)用的時(shí)候沐寺,render函數(shù)返回的東西已經(jīng)引發(fā)了渲染林艘,組件已經(jīng)被"裝載"到DOM樹上;值得注意的時(shí)混坞,render函數(shù)被調(diào)用后狐援,componentDidMount函數(shù)并不是馬上被渲染;

代碼如下:
import React, { Component } from 'react';
import Counter from './Counter';  
// app.js
class App extends React.Component {
  render() {
    console.log('enter ControlPanel render')
    return (
      <div className="App" >
        <div style={{border: '1px solid', textAlign: 'center'}}>
        <Counter caption="First" initValue={0}/>
        <Counter caption="Second" initValue={10} />
        <Counter caption="Third" initValue={20} />
        </div>
      </div>
    )
  }
}
// Counter.js
import React, { Component } from 'react';
class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: this.props.initValue,
      name: this.props.caption
    }
  }
  componentWillMount () {
    console.log('render 運(yùn)行前': this.state.name)
  }
  componentDidMount () {
    console.log('render 運(yùn)行后': this.state.count)
  }
  render () {
    retrun (
      <div>{this.state.name}: {this.state.count}<div>
    )
  }
}

結(jié)果:

componentDidMount 并不會(huì)直接運(yùn)行

可以清除的看到,componentDidMount是當(dāng)三個(gè)組件都調(diào)用完成后究孕,才一起被調(diào)用啥酱;
因?yàn)?code>render函數(shù)本身并不往DOM樹上渲染或者裝載內(nèi)容,它返回的是一個(gè)JSX表示的對(duì)象厨诸,然后由React庫(kù)根據(jù)返回對(duì)象決定如何渲染镶殷,而React庫(kù)把所有組件返回的結(jié)果綜合起來,才知道如何產(chǎn)生對(duì)應(yīng)的DOM修改微酬,所以React庫(kù)調(diào)用Counter三個(gè)組件的render函數(shù)后绘趋,才有可能完成狀態(tài),這個(gè)時(shí)候才會(huì)依次調(diào)用組件的componentDIdMount函數(shù)颗管;

更新過程

componentWillReceiveProps
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate

componentWillReceiveProps

只要父組件的render函數(shù)被調(diào)用陷遮,在render函數(shù)里面被渲染的子組件就會(huì)經(jīng)歷更新過程,不管父組件傳給子組件的props有沒有改變垦江,都會(huì)觸發(fā)子組件的componentWillReceiveProps函數(shù)帽馋。

// 代碼 接上部分代碼
// app.js
<button onClick={() => this.forceUpdate()}>aaaa</button>
// Counter.js
 componentWillReceiveProps (nextProps) {
    console.log('enter componentReceiveProps' + this.props.name)
 }
父組件render被調(diào)用

shouldComponentUpdate(nextProps, nextState)

除了render函數(shù)外,shouldCompoentUpdate可能是整個(gè)組件生命周期中最重要的一個(gè)函數(shù)了比吭;

shouldCompoentUpdate函數(shù)決定了一個(gè)組件什么時(shí)候不需要進(jìn)行渲染绽族;

shouldCompoentUpdaterender是React生命周期函數(shù)中唯二兩個(gè)要求有返回結(jié)果的函數(shù),render返回結(jié)果將用于構(gòu)造DOM對(duì)象梗逮,而shouldCompoentUpdate函數(shù)返回一個(gè)布爾值项秉,告訴React庫(kù)這個(gè)組件在本次更新中國(guó)呢是否繼續(xù);

在React庫(kù)首先調(diào)用shouldCompoentUpdate 函數(shù)慷彤,如果返回true則僅需更新娄蔼,調(diào)用render怖喻,如果返回false則停止更新過程,也不會(huì)引發(fā)后續(xù)渲染岁诉。

// 代碼接上面
// Counter.js
shouldComponentUpdate(nextProps, nextState) {
        return (nextProps.count !== this.props.count) || (nextState.count !== this.state.count)
}
componentWillUpdate () {
    console.log('componentWillUpdate')
}
componentDidUpdate () {
    console.log('componentDidUpdate')
}

當(dāng)點(diǎn)擊aaaa進(jìn)行刷新時(shí)锚沸,不會(huì)調(diào)用shouldComponentUpdate,同時(shí)也不會(huì)進(jìn)行componentWillUpdate函數(shù)等的調(diào)用,當(dāng)進(jìn)行加減操作石涕癣,則觸發(fā)哗蜈;

componentWillUpdate和componentDidUpdate

componentWillUpdate 組件初始化時(shí)不調(diào)用,只有在組件將要更新時(shí)才調(diào)用坠韩,此時(shí)可以修改state

componentDidUpdate 組件初始化時(shí)不調(diào)用距潘,組件更新完成后調(diào)用,此時(shí)可以獲取dom節(jié)點(diǎn)只搁。

卸載過程

componentWillUnmount

防止內(nèi)存泄漏
用法官方實(shí)例

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末音比,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子氢惋,更是在濱河造成了極大的恐慌洞翩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焰望,死亡現(xiàn)場(chǎng)離奇詭異骚亿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)熊赖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門来屠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秫舌,你說我怎么就攤上這事的妖⌒迕剩” “怎么了足陨?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娇未。 經(jīng)常有香客問我墨缘,道長(zhǎng),這世上最難降的妖魔是什么零抬? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任镊讼,我火速辦了婚禮,結(jié)果婚禮上平夜,老公的妹妹穿的比我還像新娘蝶棋。我一直安慰自己,他們只是感情好忽妒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布玩裙。 她就那樣靜靜地躺著兼贸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吃溅。 梳的紋絲不亂的頭發(fā)上溶诞,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音决侈,去河邊找鬼螺垢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赖歌,可吹牛的內(nèi)容都是我干的枉圃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼庐冯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼讯蒲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肄扎,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤墨林,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后犯祠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旭等,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年衡载,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搔耕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痰娱,死狀恐怖弃榨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梨睁,我是刑警寧澤鲸睛,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站坡贺,受9級(jí)特大地震影響官辈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遍坟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一拳亿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愿伴,春花似錦肺魁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胡桨。三九已至,卻和暖如春瞬雹,著一層夾襖步出監(jiān)牢的瞬間昧谊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工酗捌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呢诬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓胖缤,卻偏偏與公主長(zhǎng)得像尚镰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哪廓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 作為一個(gè)合格的開發(fā)者狗唉,不要只滿足于編寫了可以運(yùn)行的代碼。而要了解代碼背后的工作原理涡真;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,422評(píng)論 1 33
  • tips:很久沒在簡(jiǎn)書更新文章了分俯,歡迎大家逛逛我在github的博客點(diǎn)擊查看 。 React v16.0前的生命周...
    aermin閱讀 218,175評(píng)論 13 170
  • 參考鏈接1.生命周期參考鏈接12.生命周期參考鏈接2 組件繼承了react Component等相關(guān)基類哆料,也就是繼...
    嘻小佳閱讀 453評(píng)論 0 0
  • 又是一個(gè)老生常談的內(nèi)容,從ES6起已經(jīng)開始使用class的方式去創(chuàng)建組件,這種創(chuàng)建方式上的變化也帶來了寫法和方法上...
    殷灬商閱讀 454評(píng)論 0 1
  • 如何維持突破性的狀態(tài)缸剪?尊者巴關(guān)——你必須要做的是: 一、你不能睡到很晚东亦,你必須在日出前起床杏节,這是非常重要的。 二典阵、...
    Yoyo袁閱讀 129評(píng)論 2 1