react的生命周期鉤子@郝晨光

本人之前寫在CSDN上的文章躏结,原創(chuàng)轉(zhuǎn)載至此劫狠;react的生命周期鉤子


class ComponentA extends React.Component{
   constructor() {
      // 構(gòu)造函數(shù),在創(chuàng)建組件的時候調(diào)用一次骚揍。
      // 組件初始化開始
      // 初始化state
   }
   
   getDefaultProps() {
      // 設(shè)置默認(rèn)的props字管,也可以用dufaultProps設(shè)置組件的默認(rèn)屬性。
   }
   
   getInitialState() {
      // 初始化state信不,可以直接在constructor中定義this.state
   }
   
   componentWillMount() {
      // 組件將要掛載嘲叔,組件加載時調(diào)用,以后組件更新不調(diào)用抽活,整個生命周期只調(diào)用一次硫戈,此時可以修改state
      // 已經(jīng)可以讀取到state數(shù)據(jù)
      // 已經(jīng)在內(nèi)存中產(chǎn)生虛擬DOM樹 但是還沒有顯示在頁面上  
      // Tip1: 不建議在此請求數(shù)據(jù),由于請求數(shù)據(jù)接口一般都是異步下硕,這時候render已經(jīng)被執(zhí)行丁逝,建議在componentDidMount 數(shù)據(jù)
      // Tip2: 如果在服務(wù)端渲染汁胆,該鉤子函數(shù)將被調(diào)用兩次,一次服務(wù)端霜幼,一次瀏覽器端嫩码,而componentDidMount函數(shù)只會在瀏覽器端請求一次
        
   }
   
   render() {
      // react最重要的步驟,創(chuàng)建虛擬dom罪既,進(jìn)行diff算法铸题,更新dom樹都在此進(jìn)行
      // Tip:記住,不要在render里面修改state萝衩。
   }
   
   componentDidMount() {
      // 所有的組件(包括子組件)在render執(zhí)行完之后立即調(diào)用回挽,并且只會被調(diào)用一次。
      // 組件已經(jīng)初始化完成
      // DOM樹渲染完成
      // Tip: 建議在此請求數(shù)據(jù)
   }
    
   componentWillReceiveProps(nextProps) {
      // props的數(shù)據(jù)發(fā)生改變的時候觸發(fā)猩谊,在該函數(shù)內(nèi)部this.props.屬性還沒有發(fā)生變化千劈,但是可以通過第一個參數(shù)nextProps獲取到修改之后的props屬性
      // 在props被改變時被觸發(fā),初始化render時不調(diào)用牌捷。
      // 舊的屬性還是可以通過this.props來獲取墙牌,在這里通過調(diào)用this.setState()來更新你的組件狀態(tài)。
      // Tip1: 某些情況下暗甥,props沒變也會觸發(fā)該鉤子函數(shù)喜滨,需要在方法里手動判斷一下this.props和nextProps是否相同,不相同了才執(zhí)行我的更新方法撤防。
      // Tip2:該函數(shù)一般用來更新依賴props的狀態(tài)
   }
       
    
   shouldComponentUpdate(nextProps, nextState) {
      // 組件接收到新的props或者state時調(diào)用虽风,return true就會更新dom(使用diff算法更新),return false能阻止更新(不調(diào)用render)
      // 在函數(shù)內(nèi)部state和props還未改變寄月,新的props和state在兩個參數(shù)內(nèi)
      // 發(fā)生重渲染時辜膝,在render()函數(shù)調(diào)用前被調(diào)用的函數(shù),當(dāng)函數(shù)返回false時候漾肮,阻止接下來的render()函數(shù)的調(diào)用厂抖,阻止組件重渲染,而返回true時克懊,組件照常重渲染忱辅。
      // 該方法并不會在初始化渲染或當(dāng)使用forceUpdate()時被調(diào)用。
   }
    
   componentWillUpdate(nextProps, nextState) {
      // shouldComponentUpdate返回true或者調(diào)用forceUpdate之后谭溉,componentWillUpdate會被調(diào)用墙懂。
      // 數(shù)據(jù)修改,接著執(zhí)行render
   }
   
   getSnapshotBeforeUpdate(prevProps, prevState) {
      // 觸發(fā)時間: update發(fā)生的時候扮念,在render之后损搬,在組件dom渲染之前;返回一個值,作為componentDidUpdate的第三個參數(shù)场躯;配合componentDidUpdate, 可以覆蓋componentWillUpdate的所有用法
      // 該函數(shù)在最新的渲染輸出提交給DOM前將會立即調(diào)用。它讓你的組件能在當(dāng)前的值可能要改變前獲得它們旅挤。這一生命周期返回的任何值將會 作為參數(shù)被傳遞給componentDidUpdate()踢关。
   }
     
   componentDidUpdate(prevProps, prevState) {
       // 數(shù)據(jù)修改成功,組件更新完成后調(diào)用
       // 除了首次render之后調(diào)用componentDidMount粘茄,其它render結(jié)束之后都是調(diào)用componentDidUpdate签舞。
       // 通過prevProps和prevState訪問修改之前的props和state
   }
  
   componentWillUnmount() {
       // 在組件被卸載和銷毀之前立刻調(diào)用∑獍辏可以在該方法里處理任何必要的清理工作儒搭,例如解綁定時器,取消網(wǎng)絡(luò)請求芙贫,清理任何在componentDidMount環(huán)節(jié)創(chuàng)建的DOM元素搂鲫。
   }
   
   componentDidCatch(error, info) {
       // 該函數(shù)稱為錯誤邊界,捕捉發(fā)生在子組件樹中任意地方的JavaScript錯誤磺平,打印錯誤日志魂仍,并且顯示回退的用戶界面。
       // Tip:錯誤邊界只捕捉樹中發(fā)生在它們之下組件里的錯誤拣挪。一個錯誤邊界并不能捕捉它自己內(nèi)部的錯誤擦酌。
   }
}

1、React16新的生命周期棄用了componentWillMount菠劝、componentWillReceivePorps赊舶,componentWillUpdate
2、新增了getDerivedStateFromProps赶诊、getSnapshotBeforeUpdate來代替棄用的三個鉤子函數(shù)(componentWillMount笼平、componentWillReceivePorps,componentWillUpdate)
3甫何、React16并沒有刪除這三個鉤子函數(shù)出吹,但是不能和新增的鉤子函數(shù)(getDerivedStateFromProps、getSnapshotBeforeUpdate)混用辙喂,React17將會刪除componentWillMount捶牢、componentWillReceivePorps,componentWillUpdate
4巍耗、新增了對錯誤的處理(componentDidCatch)

參考文章[1]:https://blog.csdn.net/qq_32899575/article/details/81699357
參考文章[2]:https://segmentfault.com/a/1190000016617400



結(jié)言
感謝您的查閱秋麸,代碼冗余或者有錯誤的地方望不吝賜教;菜鳥一枚炬太,請多關(guān)照
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灸蟆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亲族,更是在濱河造成了極大的恐慌炒考,老刑警劉巖可缚,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斋枢,居然都是意外死亡帘靡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門瓤帚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來描姚,“玉大人,你說我怎么就攤上這事戈次⌒保” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵怯邪,是天一觀的道長绊寻。 經(jīng)常有香客問我,道長擎颖,這世上最難降的妖魔是什么榛斯? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮搂捧,結(jié)果婚禮上驮俗,老公的妹妹穿的比我還像新娘。我一直安慰自己允跑,他們只是感情好王凑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聋丝,像睡著了一般索烹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弱睦,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天百姓,我揣著相機(jī)與錄音,去河邊找鬼况木。 笑死垒拢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的火惊。 我是一名探鬼主播求类,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屹耐!你這毒婦竟也來了尸疆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寿弱,沒想到半個月后犯眠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡症革,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年阔逼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片地沮。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖羡亩,靈堂內(nèi)的尸體忽然破棺而出摩疑,到底是詐尸還是另有隱情,我是刑警寧澤畏铆,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布雷袋,位于F島的核電站,受9級特大地震影響辞居,放射性物質(zhì)發(fā)生泄漏楷怒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一瓦灶、第九天 我趴在偏房一處隱蔽的房頂上張望鸠删。 院中可真熱鬧,春花似錦贼陶、人聲如沸刃泡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烘贴。三九已至,卻和暖如春撮胧,著一層夾襖步出監(jiān)牢的瞬間桨踪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工芹啥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锻离,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓叁征,卻偏偏與公主長得像纳账,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捺疼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

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