React 設計原理解密及核心源碼解讀

1. 簡述 React 16 版本中初始渲染的流程

React 16渲染過程可以分為 Scheduler、Reconciliation八回、Commit 這三個階段


image.png
  • Scheduer (調(diào)度層):流程主要是創(chuàng)建更新
  • render (協(xié)調(diào)層):此階段負責為每一個react元素創(chuàng)建 Fiber 數(shù)據(jù)結構并為 Fiber 節(jié)點打標記effectTag屬性毫深,存儲當前 Fiber 節(jié)點要進行的 DOM 操作 ,然后在render 結束后吩坝, fiber 會被保存到 fiberroot 中
  • commit(渲染層):先獲取到render 的結果, 根據(jù) fiber 中的 effectTag 屬性進行相應的 DOM 操作哑蔫,此階段是不可以被打斷的

2.為什么 React 16 版本中 render 階段放棄了使用遞歸

  • 遞歸無法中斷钉寝,執(zhí)行重任務耗時長。
  • JavaScript 是單線程闸迷,無法同時執(zhí)行其他任務嵌纲,當VirtualDOM層次比較深,將會長期占用主線程腥沽,當用戶有其他操作逮走,就會導致任務延遲頁面卡頓,用戶體驗差巡球。

3.簡述 React 16 版本中 commit 階段的三個子階段分別做了什么事情

  • before mutation階段(執(zhí)行DOM操作前)

    • 主要調(diào)用類組件生命周期函數(shù)getSnapshotBeforeUpdate,并且把舊的props和舊的states傳遞進去
  • mutation階段(執(zhí)行DOM操作)

    • 獲取對象得effects言沐,根據(jù)不同的 effectTag 執(zhí)行不同的操作
      • 插入節(jié)點:commitPlacement
      • 更新節(jié)點:commitWork
      • 刪除節(jié)點:commitDeletion
  • layout階段(執(zhí)行DOM操作后)

    • 調(diào)用類組件的生命周期函數(shù)
      • 初次渲染階段調(diào)用componentDidMount生命周期函數(shù)
      • 更新階段調(diào)用componentDidUpdate生命周期函數(shù)
      • 執(zhí)行渲染完成之后的回調(diào)函數(shù),也就是render函數(shù)的第三個參數(shù)酣栈,并且更改this指向险胰,指向render方法的第一個參數(shù)
    • 調(diào)用函數(shù)組件的鉤子函數(shù)
      • firstEffect:指向第一個更新的節(jié)點
      • nextEffect:指向下一個更新的節(jié)點

4.簡述 workInProgress Fiber 樹存在的意義是什么

  • React 使用雙緩存技術完成 Fiber 樹的構建與替換,實現(xiàn)DOM對象的快速更新矿筝。
  • 在 React 中最多會同時存在兩棵 Fiber 樹起便,當前在屏幕中顯示的內(nèi)容對應的 Fiber 樹叫做 current Fiber 樹,當發(fā)生更新時,React 會在內(nèi)存中重新構建一顆新的 Fiber 樹榆综,這顆正在構建的 Fiber 樹叫做 workInProgress Fiber 樹妙痹。在雙緩存技術中,workInProgress Fiber 樹就是即將要顯示在頁面中的 Fiber 樹鼻疮,當這顆 Fiber 樹構建完成后怯伊,React 會使用它直接替換 current Fiber 樹達到快速更新 DOM 的目的,因為 workInProgress Fiber 樹是在內(nèi)存中構建的所以構建它的速度是非撑泄担快的耿芹。一旦 workInProgress Fiber 樹在屏幕上呈現(xiàn),它就會變成 current Fiber 樹挪哄。
  • 在 current Fiber 節(jié)點對象中有一個 alternate 屬性指向?qū)?workInProgress Fiber 節(jié)點對象吧秕,在 workInProgress Fiber 節(jié)點中有一個 alternate 屬性也指向?qū)?current Fiber 節(jié)點對象。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迹炼,一起剝皮案震驚了整個濱河市砸彬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斯入,老刑警劉巖砂碉,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刻两,居然都是意外死亡绽淘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門闹伪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沪铭,“玉大人,你說我怎么就攤上這事偏瓤∩钡。” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵厅克,是天一觀的道長赔退。 經(jīng)常有香客問我,道長证舟,這世上最難降的妖魔是什么硕旗? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮女责,結果婚禮上漆枚,老公的妹妹穿的比我還像新娘。我一直安慰自己抵知,他們只是感情好墙基,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布软族。 她就那樣靜靜地躺著,像睡著了一般残制。 火紅的嫁衣襯著肌膚如雪立砸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天初茶,我揣著相機與錄音颗祝,去河邊找鬼。 笑死恼布,一個胖子當著我的面吹牛吐葵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桥氏,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猛铅!你這毒婦竟也來了字支?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤奸忽,失蹤者是張志新(化名)和其女友劉穎堕伪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栗菜,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡欠雌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疙筹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片富俄。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖而咆,靈堂內(nèi)的尸體忽然破棺而出霍比,到底是詐尸還是另有隱情,我是刑警寧澤暴备,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布悠瞬,位于F島的核電站,受9級特大地震影響涯捻,放射性物質(zhì)發(fā)生泄漏浅妆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一障癌、第九天 我趴在偏房一處隱蔽的房頂上張望凌外。 院中可真熱鬧,春花似錦涛浙、人聲如沸趴乡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晾捏。三九已至蒿涎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惦辛,已是汗流浹背劳秋。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胖齐,地道東北人玻淑。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像呀伙,于是被迫代替她去往敵國和親补履。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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