欧美精品在线一区二区三区_亚洲女同精品视频_日韩一区免费_国产欧美久久久精品免费_国产这里只有精品_僵尸再翻生在线观看_久久99精品国产一区二区三区_亚洲免费一区二区_女教师淫辱の教室蜜臀av软件_中文字幕国产一区二区

重新學(xué)習(xí) React (一) 生命周期,F(xiàn)iber 調(diào)度和更新機(jī)制

2019-6-12    seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請點(diǎn)這里

前幾天面試問道 react 的相關(guān)知識,對我打擊比較大,感覺對 react 認(rèn)識非常膚淺,所以在這里重新梳理一下,想想之前沒有仔細(xì)思考過的東西。

另外有說的不對的地方還請幫我指正一下,先謝謝各位啦。

目錄索引:

什么是生命周期和調(diào)度?

React 有一套合理的運(yùn)行機(jī)制去控制程序在指定的時(shí)刻該做什么事,當(dāng)一個(gè)生命周期鉤子被觸發(fā)后,緊接著會(huì)有下一個(gè)鉤子,直到整個(gè)生命周期結(jié)束。

生命周期

生命周期代表著每個(gè)執(zhí)行階段,比如組件初始化,更新完成,馬上要卸載等等,React 會(huì)在指定的時(shí)機(jī)執(zhí)行相關(guān)的生命周期鉤子,使我們可以有機(jī)在程序運(yùn)行中會(huì)插入自己的邏輯。

調(diào)度

我們寫代碼的時(shí)候往往會(huì)有很多組件以及他們的子組件,各自調(diào)用不同的生命周期,這時(shí)就要解決誰先誰后的問題,在 react v16 之前是采用了遞歸調(diào)用的方式一個(gè)一個(gè)執(zhí)行,而在現(xiàn)在 v16 的版本中則采用了與之完全不同的處理(調(diào)度)方式,名叫 Fiber,這個(gè)東西 facebook 做了有兩年時(shí)間,實(shí)現(xiàn)非常復(fù)雜。

具體 Fiber 它是一個(gè)什么東西呢?不要著急,我們先從最基本的生命周期鉤子看起。

React 生命周期詳解

首先看一下 React V16.4 后的生命周期概況(圖片來源

 

 

  • 從橫向看,react 分為三個(gè)階段:
    • 創(chuàng)建時(shí)
      • constructor() - 類構(gòu)造器初始化
      • static getDerivedStateFromProps() - 組件初始化時(shí)主動(dòng)觸發(fā)
      • render() - 遞歸生成虛擬 DOM
      • componentDidMount() - 完成首次 DOM 渲染
    • 更新時(shí)
      • static getDerivedStateFromProps() - 每次 render() 之前執(zhí)行
      • shouldComponentUpdate() - 校驗(yàn)是否需要執(zhí)行更新操作
      • render() - 遞歸生成虛擬 DOM
      • getSnapshotBeforeUpdate() - 在渲染真實(shí) DOM 之前
      • componentDidUpdate() - 完成 DOM 渲染
    • 卸載時(shí)
      • componentWillUnmount() - 組件銷毀之前被直接調(diào)用

一些干貨

  • 有三種方式可以觸發(fā) React 更新,props 發(fā)生改變,調(diào)用 setState() 和調(diào)用 forceUpdate()
  • static getDerivedStateFromProps() 這個(gè)鉤子會(huì)在每個(gè)更新操作之前(即使props沒有改變)執(zhí)行一次,使用時(shí)應(yīng)該保持謹(jǐn)慎。
  • componentDidMount() 和 componentDidUpdate() 執(zhí)行的時(shí)機(jī)是差不多的,都在 render 之后,只不過前者只在首次渲染后執(zhí)行,后者首次渲染不會(huì)執(zhí)行
  • getSnapshotBeforeUpdate() 執(zhí)行時(shí)可以獲得只讀的新 DOM 樹,此函數(shù)的返回值為 componentDidUpdate(prevProps, prevState, snapshot) 的第三個(gè)參數(shù)

嘗試?yán)斫?Fiber

關(guān)于 Fiber,強(qiáng)烈建議聽一下知乎上程墨Morgan的 live 《深入理解React v16 新功能》,這里潛水員的例子和圖片也是引用于此 live。

背景

我們知道 React 是通過遞歸的方式來渲染組件的,在 V16 版本之前的版本里,當(dāng)一個(gè)狀態(tài)發(fā)生變更時(shí),react 會(huì)從當(dāng)前組件開始,依次遞歸調(diào)用所有的子組件生命周期鉤子,而且這個(gè)過程是同步執(zhí)行的且無法中斷的,一旦有很深很深的組件嵌套,就會(huì)造成嚴(yán)重的頁面卡頓,影響用戶體驗(yàn)。

React 在V16版本之前的版本里引入了 Fiber 這樣一個(gè)東西,它的英文涵義為纖維,在計(jì)算機(jī)領(lǐng)域它排在在進(jìn)程和線程的后面,雖然 React 的 Fiber 和計(jì)算機(jī)調(diào)度里的概念不一樣,但是可以方便對比理解,我們大概可以想象到 Fiber 可能是一個(gè)比線程還短的時(shí)間片段。

Fiber 到底做了什么事

Fiber 把當(dāng)前需要執(zhí)行的任務(wù)分成一個(gè)個(gè)微任務(wù),安排優(yōu)先級,然后依次處理,每過一段時(shí)間(非常短,毫秒級)就會(huì)暫停當(dāng)前的任務(wù),查看有沒有優(yōu)先級較高的任務(wù),然后暫停(也可能會(huì)完全放棄)掉之前的執(zhí)行結(jié)果,跳出到下一個(gè)微任務(wù)。同時(shí) Fiber 還做了一些優(yōu)化,可以保持住之前運(yùn)行的結(jié)果以到達(dá)復(fù)用目的。

舉個(gè)潛水員的例子

我們可以把調(diào)度當(dāng)成一個(gè)潛水員在海底尋寶,v16 之前是通過組件遞歸的方式進(jìn)行尋寶,從父組件開始一層一層深入到最里面的子組件,也就是如下圖所示。

 

 

 

而替換成了 Fiber 后,海底變成的狹縫(簡單理解為遞歸變成了遍歷),潛水員會(huì)每隔一小段時(shí)間浮出水面,看看有沒有其他尋寶任務(wù)。注意此時(shí)沒有尋到寶藏的話,那么之前潛水的時(shí)間就浪費(fèi)了。就這樣潛水員會(huì)一直下潛和冒泡,具體如下圖所示。

 

 

 

引入 Fiber 后帶來的三個(gè)階段

從生命周期那張圖片縱向來看,F(xiàn)iber 將整個(gè)生命周期分成了三個(gè)階段:

  • render 階段
    • 由于 Fiber 會(huì)時(shí)不時(shí)跳出任務(wù),然后重新執(zhí)行,會(huì)導(dǎo)致該階段的生命周期調(diào)用多次的現(xiàn)象,所以 React V16 之前 componentWillMount()componentWillUpdate()componentWillReceiveProps() 的三個(gè)生命周期鉤子被加上了 UNSAFE 標(biāo)記
    • 這個(gè)階段效率不一定會(huì)比之前同步遞歸來的快,因?yàn)闀?huì)有任務(wù)跳出重做的性能損耗,但是從宏觀上看,它不斷執(zhí)行了最高優(yōu)先級(影響用戶使用體驗(yàn))的任務(wù),所以用戶使用起來會(huì)比以前更加的流暢
    • 這個(gè)階段的生命周期鉤子可能會(huì)重復(fù)調(diào)用,建議只寫無副作用的代碼
  • pre-commit 階段
    • 該階段 DOM 已經(jīng)形成,但還是只讀狀態(tài)
    • 這個(gè)階段組件狀態(tài)不會(huì)再改變
  • commit 階段
    • 此時(shí)的 DOM 可以進(jìn)行操作
    • 這個(gè)階段組件已經(jīng)完成更新,可以寫一些有副作用的代碼和添加其它更新操作。

簡而言之:以 render() 為界,之前執(zhí)行的生命周期都有可能會(huì)打斷并多次調(diào)用,之后的生命周期是不可被打斷的且只會(huì)調(diào)用一次。所以盡量把副作用的代碼放在只會(huì)執(zhí)行一次的 commit 階段。

其它生命周期鉤子

除了上面常用的鉤子,React 還提供了如下鉤子:

  • static getDerivedStateFromError() 在 render 階段執(zhí)行,通過返回 state 更新組件狀態(tài)
  • componentDidCatch() 在 commit 階段執(zhí)行,可以放一些有副作用的代碼

更新機(jī)制

理解了生命周期和三個(gè)執(zhí)行階段,就可以比較容易理解組件狀態(tài)的更新機(jī)制了。

setState()

這個(gè)方法可以讓我們更新組件的 state 狀態(tài)。第一個(gè)參數(shù)可以是對象,也可以是 updater 函數(shù),如果是函數(shù),則會(huì)接受當(dāng)前的 state 和 props 作為參數(shù)。第二個(gè)參數(shù)為函數(shù),是在 commit 階段后執(zhí)行,準(zhǔn)確的說是在 componentDidUpdate() 后執(zhí)行。

setState() 的更新過程是異步的(除非綁定在 DOM 事件中或?qū)懺?setTimeout 里),而且會(huì)在最后合并所有的更新,如下:

Object.assign( previousState,
  {quantity: state.quantity + 1},
  {quantity: state.quantity + 1},
  ...
)
復(fù)制代碼

之所以設(shè)計(jì)成這樣,是為了避免在一次生命周期中出現(xiàn)多次的重渲染,影響頁面性能。

forceUpdate()

如果我們想強(qiáng)制刷新一個(gè)組件,可以直接調(diào)用該方法,調(diào)用時(shí)會(huì)直接執(zhí)行 render() 這個(gè)函數(shù)而跳過 shouldComponentUpdate()

舉個(gè)極端例子

function wait() { return new Promise(resolve => {
    setTimeout(() => {
      resolve(); console.log("wait");
    }, 0);
  });
} //......省略組件創(chuàng)建 async componentDidMount() { await wait(); this.setState({ name: "new name" }); console.log("componentDidMount");
}

componentDidUpdate() { console.log("componentDidUpdate");
}

render() { console.log(this.state); return null } //......省略組件創(chuàng)建 // 輸出結(jié)果如下 // wait // {name: "new name"} // componentDidUpdate // componentDidMount // 注意 componentDidUpdate 的輸出位置,一般情況下 // componentDidUpdate 都是在componentDidMount 后面 // 執(zhí)行的,但是這里因?yàn)閟etState 寫在了 await 后面 // 所以情況相反。 復(fù)制代碼

結(jié)語

了解 react 生命周期和更新機(jī)制確實(shí)有利于編寫代碼,特別是當(dāng)代碼量越來越大時(shí),錯(cuò)用的 setState 或生命周期鉤子都可能埋下越來越多的雷,直到有一天無法維護(hù)。。。

我的個(gè)人建議如下:

  • 把副作用代碼通通放在 commit 階段,因?yàn)檫@個(gè)階段不會(huì)影響頁面渲染性能
  • 盡可能不要使用 forceUpdate() 方法,借用 Evan You 的一句話,如果你發(fā)現(xiàn)你自己需要在 Vue 中做一次強(qiáng)制更新,99.9% 的情況,是你在某個(gè)地方做錯(cuò)了事
  • 只要調(diào)用了 setState() 就會(huì)進(jìn)行 render(),無論 state 是否改變
  • 知道 setState() 更新的什么時(shí)候是同步的,什么時(shí)候是異步的,參見上文
  • 不要把 getDerivedStateFromProps() 當(dāng)成是 UNSAFE_componentWillReceiveProps() 的替代品,因?yàn)?nbsp;getDerivedStateFromProps() 會(huì)在每次 render() 之前執(zhí)行,即使 props 沒有改變




藍(lán)藍(lán)設(shè)計(jì)www.ocunn.cn )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)

日歷

鏈接

個(gè)人資料

存檔

91在线短视频| 国产福利一区在线观看| 国产婷婷色一区二区三区| 在线观看免费一区| 九九热r在线视频精品| 精品人伦一区二区三区| wwwwwxxxx日本| 日韩精品在线不卡| 番号集在线观看| 丁香5月婷婷久久| 蜜桃久久久久久久| 欧美日韩一区二区在线 | 国产精品高潮粉嫩av| 路边理发店露脸熟妇泻火| 欧洲一级黄色片| 亚洲美女性生活| 亚洲国产尤物| 亚洲影音先锋| 亚洲一卡二卡三卡四卡无卡久久| 国产亚洲精品美女久久久| 粉嫩av一区二区三区免费观看| 超碰影院在线观看| 久久露脸国语精品国产91| yourporn在线观看中文站| 欧美人与动xxxxz0oz| 国产精品自拍网站| 欧美精品九九99久久| 国产精品国语对白| 动漫av免费观看| 国产成人综合欧美精品久久| 午夜影院免费在线| 中文字幕一区二区三三| 亚洲美女屁股眼交| 久久不射电影网| 裸体裸乳免费看| 亚洲波多野结衣| 国产精品麻豆一区二区三区 | 国产精品久久久久久亚洲伦| 亚洲无线码在线一区观看| 久久久久久亚洲精品不卡4k岛国 | 清纯唯美亚洲色图| 妖精视频一区二区三区| 国产清纯白嫩初高生在线观看91| 亚洲欧美福利视频| 欧美日本亚洲| 欧美人与性囗牲恔配| 三级在线播放| 成人区精品一区二区婷婷| 国产精品午夜在线| 最近2019中文字幕一页二页| 天天好比中文综合网| 少妇视频一区二区| 色哟哟免费在线观看| 欧美一区高清| 午夜亚洲福利老司机| 欧美孕妇性xx| 羞羞的视频在线| www.亚洲天堂.com| 综合久久成人| 欧美激情一区不卡| 久久99久久99精品免观看粉嫩| 久久久久久久9| 天堂网视频在线| 国产精品粉嫩| 国产精一区二区三区| 日韩电影免费在线观看中文字幕| 日韩和欧美的一区二区| 婷婷伊人五月天| 色婷婷在线播放| 久久精品系列| 精品人在线二区三区| 久久久综合亚洲91久久98| 欧美xxxx精品| 一区二区三区伦理| 久久精品九九| 日韩精品一区二区三区三区免费 | 88xx成人永久免费观看| 狠狠色综合日日| 亚洲男人天堂2019| 日产精品久久久久久久蜜臀| 无码任你躁久久久久久久| 狂野欧美性猛交xxxx| 91在线观看高清| 精品少妇v888av| 亚欧激情乱码久久久久久久久| 国产91麻豆视频| 国产尤物久久久| 午夜视频一区二区| 97人摸人人澡人人人超一碰| 五月天精品在线| 欧美人与禽性xxxxx杂性| 秋霞电影一区二区| 亚洲欧美日本精品| 国产69精品久久久久999小说| 亚洲怡红院av| 亚洲日本三级| 日韩欧美精品免费在线| 成人自拍爱视频| 69xx绿帽三人行| 网友自拍亚洲| 久久九九久精品国产免费直播| 欧美夫妻性生活xx| 国产在线a视频| av免费在线一区二区三区| 视频一区二区欧美| 日韩麻豆第一页| 看av免费毛片手机播放| 亚洲AV第二区国产精品| 中文字幕人成人乱码| 51久久夜色精品国产麻豆| 亚洲国产一区二区在线| 天天操天天干天天摸| 国产精品成人自拍| 亚洲成av人片在www色猫咪| 国产成人av一区二区三区| 日本一级二级视频| 欧美美女被草| 亚洲精品久久嫩草网站秘色| 91社区国产高清| 欧美国产精品一二三| 白嫩亚洲一区二区三区| 亚洲色图视频网| 99久久99久久| 久久久免费高清视频| 卡通动漫精品一区二区三区| 狠狠色狠色综合曰曰| 日本不卡一区| 亚洲一区二区三区网站| 国产精品毛片一区二区在线看| 欧美理论电影在线| 天堂а√在线中文在线| 天堂av资源网| 久久亚洲欧洲| 久久99热这里只有精品国产| 妖精视频一区二区| 色网在线免费观看| 国产精品区一区二区三| aa日韩免费精品视频一| 国产成人在线视频观看| 国产成人调教视频在线观看 | 国产成人一级片| 蜜臀久久99精品久久一区二区| 在线看不卡av| 黄色片免费在线观看视频| 色呦呦中文字幕| 蜜桃视频一区| 欧美高清视频在线观看| 久久av无码精品人妻系列试探| 性高爱久久久久久久久| 亚洲免费观看高清完整版在线观看熊| 精品久久久久久乱码天堂| 国产乡下妇女三片| 希岛爱理一区二区三区| 亚洲毛茸茸少妇高潮呻吟| 午夜激情影院在线观看| av电影免费在线看| 国产精品免费aⅴ片在线观看| 国产高清一区视频| 中文在线观看免费高清| 一区二区三区在线电影| 亚洲视频在线观看网站| 欧美xxxxx少妇| 97人人做人人爽香蕉精品| 亚洲国产色一区| 国产精品波多野结衣| 在线宅男视频| 国产91丝袜在线播放| 国产一区二区色| 免费一级a毛片| 精品91久久久久| 久久综合伊人77777| jizzjizz日本少妇| 高清日韩中文字幕| 日韩一区二区三区三四区视频在线观看 | 91蜜桃网址入口| 国产欧美欧洲| 欧美一级片免费| 精品亚洲免费视频| 国产精品日韩在线播放| 黄色av一级片| 亚洲天堂成人| 久久免费在线观看| 久草视频中文在线| 日韩在线理论| 久久精品国产精品| 黄色片子在线观看| 教室别恋欧美无删减版| 国产一区二区三区日韩欧美| 99久久久无码国产精品衣服| 噜噜噜狠狠夜夜躁精品仙踪林| 精品国产乱子伦一区| 中文字幕第九页| 999精品视频在线观看| 678五月天丁香亚洲综合网| 999在线精品视频| **精品中文字幕一区二区三区| 欧美日韩一区二区三区四区 | 亚洲av首页在线| 在线国产情侣| 自拍av一区二区三区| 国产日韩欧美大片| 爆操欧美美女| 天天综合色天天综合| 精品视频无码一区二区三区| 小草在线视频免费播放| 色综合久久六月婷婷中文字幕| 91激情视频在线| yw.尤物在线精品视频| 777奇米四色成人影色区| www.欧美com| 国语一区二区三区| 亚洲欧洲视频在线| 男人av资源站| 欧美在线精品一区| 全球成人中文在线| 97精品久久人人爽人人爽| 轻轻草成人在线| 成人在线观看91| 天堂а在线中文在线无限看推荐| 国产日韩精品久久久| 国产日产欧美一区二区| 黄色成人在线网| 色老汉av一区二区三区| 亚洲高清av一区二区三区| 日韩精品亚洲专区在线观看| 亚洲欧美国产va在线影院| 欧美日韩黄色网| 尤物精品在线| 国产在线观看一区二区三区| 欧美视频久久久| 国产亚洲综合av| 国产精品自拍合集| 日韩伦理在线一区| 91精品婷婷国产综合久久竹菊| 国产chinese中国hdxxxx| 在线日韩一区| 久久久久一本一区二区青青蜜月| 亚洲天堂视频在线播放| 韩国精品久久久| 亚洲精品中文字幕在线| 呦呦在线视频| 8x福利精品第一导航| 我不卡一区二区| 亚洲视频一区| 99在线看视频| 91官网在线| 在线观看不卡视频| 国产白嫩美女无套久久| 亚洲成人三区| 国产精品专区h在线观看| 国产导航在线| 亚洲一二三级电影| 免费不卡av网站| 最新国产一区| 欧洲成人午夜免费大片| 五月婷婷在线播放| 亚洲免费在线播放| 爱情岛论坛亚洲自拍| 欧美手机在线| 国产综合在线观看视频| 一级视频在线观看| 午夜精品福利久久久| www.美色吧.com| 欧美欧美天天天天操| 91色在线观看| 五月婷婷在线观看| 欧美日韩激情一区| 天堂av免费在线| 捆绑变态av一区二区三区| 亚洲国产另类久久久精品极度| 国产精品电影| 亚洲精品天天看| 无码人妻av免费一区二区三区| 成人黄色一级视频| 男人揉女人奶房视频60分| 一区二区亚洲视频| 97在线观看免费| 小香蕉视频在线| 日韩欧美在线视频日韩欧美在线视频| 精品黑人一区二区三区观看时间| 亚洲视频观看| 欧美一二三四五区| 欧美影视资讯| 九九精品在线播放| 午夜在线视频免费| 婷婷中文字幕综合| 白白色免费视频| 日韩精品一级二级 | 久久青青草视频| 91蝌蚪porny九色| 三上悠亚在线一区二区| 欧美gayvideo| 国产精品亚洲不卡a| 久久不射影院| 亚洲人免费视频| 国产精品一区二区免费视频| 亚洲色图一区二区三区| 最近中文字幕无免费| 亚洲永久免费精品| 偷拍盗摄高潮叫床对白清晰| 久久gogo国模啪啪裸体| 97在线免费视频| aaa日本高清在线播放免费观看| 91麻豆精品国产91久久久久久 | 亚洲欧美自拍偷拍色图| 黄色激情在线观看| 中文亚洲免费| 日本精品福利视频| 露出调教综合另类| 91精品久久久久久久久中文字幕| www视频在线看| 亚洲欧美中文日韩v在线观看| 国产乱码一区二区| 精品国产成人av| 无码人妻精品一区二区三区夜夜嗨| 大尺度一区二区| 91高清国产视频| 亚洲精华国产欧美| 国产内射老熟女aaaa| 丝袜久久网站| 国产精品午夜av在线| 久久69成人| 热久久这里只有| 黄色影院在线看| 欧美老少做受xxxx高潮| 成人全视频高清免费观看| 精品亚洲夜色av98在线观看| 亚洲黄色精品视频| 欧美午夜精品久久久久久孕妇| 亚洲永久精品在线观看| 一区二区三区在线观看国产| 国产稀缺精品盗摄盗拍| 国产午夜精品美女毛片视频| 国产肉体xxxx裸体784大胆| 国产一区在线观看视频| 九九热免费在线观看| 国产欧美在线| 1024av视频| 精品福利电影| 日本在线xxx| 国产精品porn| 野外做受又硬又粗又大视频√| 成人一区二区| 这里只有精品66| 北条麻妃国产九九九精品小说| 热re99久久精品国产99热| 国产伦精品一区二区三区在线播放| 亚洲自拍偷拍在线| 天天综合91| 91pron在线| 日韩av综合| 国产日韩久久| 欧美精品中文字幕亚洲专区| 久久国产精品久久| 久久精品国产亚洲5555| 精品日韩电影| 日韩影视在线观看| 五月天久久综合网| 久久国产影院| 99久久免费观看| 国内在线观看一区二区三区| 国产精品12345| 亚洲欧美日韩国产| 手机在线免费观看毛片| 日韩有码一区二区三区| 波多野结衣国产精品| 久久爱另类一区二区小说| 亚洲一级片免费观看| 国产成人亚洲综合a∨婷婷| 国产老熟女伦老熟妇露脸| 91尤物视频在线观看| 欧美成人另类视频| 国产精品久久久久久久裸模| 欧美卡一卡二卡三| 亚洲一区在线观看视频| 成人毛片18女人毛片| 欧美日韩激情视频| 91久久久久国产一区二区| 日韩一二三区不卡| 亚洲电影小说图| 日韩天堂在线视频| a毛片在线观看| 国产成人精品久久久| 黄色成人小视频| 精品欧美一区二区久久久伦| 国产免费av一区二区三区| 六月婷婷激情网| 国产日韩欧美三级| 久久人人爽人人片| jlzzjlzz亚洲日本少妇| 特黄一区二区三区| 亚洲午夜久久久久中文字幕久| 羞羞色院91蜜桃| 日韩美女在线视频| 国产在线小视频| 久久噜噜噜精品国产亚洲综合| 粉嫩一区二区| 国产亚洲欧美一区二区三区| 欧美亚洲国产激情| 无码精品a∨在线观看中文|