精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

理解 React 的調和器 Reconciler

開發 前端
ReactElement 就是 React.createElement() 方法的返回結果,一種 映射真實 DOM 層級關系的對象,但里面可以帶上組件元素。通常我們會用 JSX 去寫。

大家好,我是前端西瓜哥。今天來學習 React 中的調和器 Reconciler。

React 的版本為 18.2.0

ReactElement、fiber 和 Dom

ReactElement 就是 React.createElement() 方法的返回結果,一種 映射真實 DOM 層級關系的對象,但里面可以帶上組件元素。通常我們會用 JSX 去寫。

類組件的 render 方法的返回值和函數組件的返回值都是 ReactElement。

fiber 是一個節點,是 React Fiber 時間分片架構中的一個節點。fiber 是 ReactElement 和真實 DOM 的橋梁。

fiber 會根據 ReactElement 構建成一棵樹。當更新時,組件會調用 render 方法生成新的 ReactElement,然后我們再構建一個新的 Fiber 樹,和舊樹對比。

fiber 樹下的 fiber 節點通過下面三個字段進行關聯:

  • return:父 fiber。
  • child:子 fiber 的第一個。
  • sibling :下一個兄弟節點。

一個 App 組件的 fiber 樹結構:

圖片

App 的 child 是會指向它創建的 element 對應 fiber 的根節點。

構建 Fiber 樹的過程

在調用 createRoot(并發模式)或者 ReactDOM.render(同步模式)時,會執行 createFiberRoot 方法。

function createFiberRoot(containerInfo, tag) {
// 生成 fiberRoot。containerInfo 是掛載根節點(比如 div#root)
const root = new FiberRootNode(containerInfo, tag);
// 生成 rootFiber
const uninitializedFiber = createHostRootFiber(tag);
// 互相關聯
root.current = uninitializedFiber;
uninitializedFiber.stateNode = root;

return root;
}

createFiberRoot 創建一個了 fiberRoot,以及一個 rootFiber。它們的關系如下:

圖片

一個 fiberRoot 是 fiber 樹的根節點的維護者,是 fiberRootNode 實例,通過 current 確定要使用哪一棵 fiber 樹。

每調用 createRoot 都會構建新的 fiber 樹,并生成一個新的 fiberRoot 去指向它。

rootFiber 是一顆 fiber 樹的根節點,也屬于是 fiber 節點。rootFiber 通過屬性 stateNode 訪問到 fiberRoot。注意不是 return,因為 fiberRoot 的結構完全不一樣,不是 fiber 節點。

creatRoot 方法返回的是個對象,它的 _internalRoot 屬性指向的是這個 fiberRoot。

performUnitOfWork

在 workLoopSync 或 workLoopConcurrent 中,是會不斷地調用  performUnitOfWork(workInProgress) 的。

這個函數會不斷地處理以 fiber 為單位的任務。

workLoopConcurrent 的實現:

function workLoopConcurrent() {
while (workInProgress !== null && !shouldYield()) {
performUnitOfWork(workInProgress);
}
}

看看 performUnitOfWork 的核心實現:

function performUnitOfWork(unitOfWork) {
// 拿到當前 fiber 節點的 “替身”
var current = unitOfWork.alternate;
var next = beginWork(current, unitOfWork, subtreeRenderLanes); // 遞
if (next === null) {
completeUnitOfWork(unitOfWork); // 歸
} else {
workInProgress = next;
}
}

performUnitOfWork 由兩部分組成:

  1. beginWork:自上而下的調和,主要在構建 fiber。fiber 其實是對之前架構 “遞歸” 的模擬,這個 beginWork 對應著 “遞”。
  2. completeUnitOfWork:自下而上的合并階段。對應遞歸的 “歸”。

還是這個 fiber 樹的圖,這里的粉色的 1、2、4 表示的是 beginWork,3、5 則代表 completeUnitOfWork。

圖片

beginWork

performUnitOfWork 中,先調用 beginWork。

beginWork 的作用是,自上而下根據組件進行組件實例化,根據新的 element 構建 fiber,給舊的 fiber 打上 effectTag。

function beginWork(current, workInProgress, renderLanes) {
if (current !== null) {
const oldProps = current.memoizedProps;
const newProps = workInProgress.pendingProps;
}

// 根據不同類型的組件,進行不同的操作
switch (workInProgress.tag) {
// ...

case ClassComponent: {
const Component = workInProgress.type;
// 未處理的新 props 對象
const unresolvedProps = workInProgress.pendingProps;
const resolvedProps =
workInProgress.elementType === Component
? unresolvedProps
: resolveDefaultProps(Component, unresolvedProps);
// 更新組件
return updateClassComponent(
current,
workInProgress,
Component,
resolvedProps,
renderLanes,
);
}

// ...
}
}

current 是舊節點,workInProgress 是新節點,屬于半成品,會在執行過程中一點點填充內容。

beginWork 會進行深度優先遍歷,生成的新節點 workInProcess 會 tag 屬性進入不同的 update 邏輯分支,比如常見的 updateHostRoot、updateClassComponent、updateFunctionComponent 等。

  1. 會做組件實例化,拿到新 ReactElement,然后調用 reconcileChildFibers 方法進行 新舊節點 diff,深度遞歸構建子 fiber,形成子 fiber 樹,并把一些數據持久化掛載到 fiber 上。
  2. 在這個過程中,會給 workInProcess 打標記。具體是在 fiber.flags 上標記  Placement(插入)、Update(更新)等 flags。比如在同層級進行對比,發現舊節點有需要刪除的 fiber,這些 fiber 會放到新父 fiber 的 deletions 數組中,并加上 ChildDetetion 標簽。
  3. 這期間穿插調用了一些生命周期函數(比如 shouldComponentUpdate),都是是在新舊節點對比前,準確來說是調用 render 拿到 ReactElement 的時機之前。

completeUnitOfWork

performUnitOfWork 中,調用完 beginWork 后,會返回一個 next。這個 next 就是下一個要處理的 fiber,是 unitOfWork 的子 fiber。

這個 next 會賦值給 workInProgress,然后 workLoopConcurrent 的循環會 處理這個新的 workInProcess。

但當 next 為 null,就表示找不到下一個 fiber 了,深度的 “遞” 到底了,就要 調用 completeUnitOfWork,進行 “歸” 的收尾工作。

completeUnitOfWork 做的主要工作有:

  1. 根據 fiber 的類型不同,進行不同的處理。對于原生組件類型(比如 div、span)的掛載階段,會用 createInstance 創建 一個真實 DOM,這個 DOM 下還沒有子節點,然后還會將其下所有子 fiber 對應的真實 DOM 加到這個 DOM 下,然后賦值給 fiber.stateNode,此時這個 DOM 元素目前什么屬性都沒有。
  2. 根據 props,調用 setInitialProperties 方法綁定合成事件,以及設置 DOM 屬性。

React 16 時會生成一個 effectList 來記錄需要更新的節點,防止不必要的遍歷整棵樹。但 React 17 后被移除掉了,改成從 rootFiber 開始從上往下遍歷。

結尾

調和階段,主要分為 beginWork 和 completeUnitOfWork 兩部分。

beginWork 自上而下,進行新舊節點對比,構造子 fiber,并打上 flag(插入、更新、刪除),會執行 render(生成新 ReactElement) 之前的生命周期函數。對應以前 stack reconciler 架構中遞歸的 “遞”。

completeUnitOfWork 自下而上,如果是插入,則構建真實 DOM 節點放到 fiber.stateNode 下,接著是處理 props,將屬性添加到 DOM 上。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2023-03-28 07:59:57

ReactReconciler

2021-11-26 08:33:51

React組件前端

2022-07-06 08:30:36

vuereactvdom

2024-03-22 07:48:51

ReactScheduler底層調度器

2016-10-26 20:49:24

ReactJavascript前端

2021-05-11 08:48:23

React Hooks前端

2022-12-20 08:22:42

CommitMuation

2022-12-23 08:34:30

HookReact

2024-04-19 12:50:58

人工智能OpenAI

2022-05-04 10:38:58

React閉包組件

2021-06-30 07:19:36

React事件機制

2022-12-07 11:21:30

Reactdiff

2023-11-16 07:43:26

Next.jsReact

2024-01-16 08:43:51

React底層機制Hook

2022-05-05 08:31:48

useRefuseEffecthook

2022-08-21 09:41:42

ReactVue3前端

2021-07-07 08:36:45

React應用場景

2020-04-27 09:40:13

Reacthooks前端

2023-11-29 09:00:55

ReactuseMemo

2024-04-10 10:09:07

點贊
收藏

51CTO技術棧公眾號

亚洲精品乱码久久久久久金桔影视| 亚洲狠狠丁香婷婷综合久久久| 国产精品观看在线亚洲人成网| 色屁屁草草影院ccyy.com| 亚洲aⅴ网站| 亚洲自拍偷拍欧美| 日本高清不卡一区二区三| 国产精品久久久久久久久毛片| 国产精品va| 亚洲天堂男人天堂| 中文字幕欧美视频| 在线免费日韩片| 成人欧美一区二区三区视频网页| 91久久极品少妇xxxxⅹ软件| 黄色片视频免费| 欧美国产精品| 中文字幕一精品亚洲无线一区| 国产sm在线观看| 欧美天堂视频| 亚洲综合免费观看高清在线观看| 欧美日韩日本网| 蜜桃av中文字幕| 美女视频免费一区| 91高清视频免费观看| 神马久久精品综合| 精品国产一区二区三区久久久蜜臀 | 午夜精品网站| 66久久国产| 日韩欧美在线网址| 欧美一区二区三区综合| 国产视频二区在线观看| 波多野结衣中文字幕一区二区三区 | 久久一日本道色综合久久| 九九热精品视频| 日本成人精品视频| av影片在线一区| 日韩久久精品电影| 午夜视频在线观看国产| 色播一区二区| 91精品国产色综合久久ai换脸| 男人搞女人网站| 欧美成人h版| 精品国产户外野外| 精品少妇一区二区三区在线| 俺来也官网欧美久久精品| 亚洲欧美日韩一区| 国产四区在线观看| 麻豆网在线观看| 日韩一区中文字幕| 黄色高清视频网站| 成人在线免费看片| 亚洲美女视频在线| www.国产亚洲| 国产桃色电影在线播放| 亚洲午夜私人影院| 白白操在线视频| 日韩伦理电影网站| 亚洲一区二区三区四区的| 久操手机在线视频| 国产理论电影在线| 精品福利樱桃av导航| 国产高清精品在线观看| 黑人精品一区| 欧美日韩精品福利| 午夜不卡福利视频| baoyu135国产精品免费| 亚洲国产97在线精品一区| 四季av综合网站| 西野翔中文久久精品国产| 亚洲免费av电影| 国产黄色大片免费看| 国产韩日影视精品| 欧美夫妻性视频| 亚洲影院在线播放| 久久精品久久综合| dy888夜精品国产专区| 少妇精品高潮欲妇又嫩中文字幕| 久久久精品日韩欧美| 夜夜爽99久久国产综合精品女不卡 | 狠狠操精品视频| 国产国产一区| 精品久久久久久久久久久久久久久久久 | 小说区图片区色综合区| 尤物yw午夜国产精品视频| 日韩在线观看免| 亚洲五月婷婷| 国产精品欧美在线| 二区三区在线视频| 欧美激情一区在线观看| 日韩免费在线观看av| 都市激情亚洲综合| 欧美一区二区三区视频免费播放| 老司机午夜免费福利| 国内精品久久久久久久久电影网 | 成人性教育av免费网址| 欧美日本国产视频| a级一a一级在线观看| 日本久久精品| 91国产美女在线观看| 91无套直看片红桃| 91一区二区三区在线播放| 一区二区在线观看网站| 蜜桃视频m3u8在线观看| 91精品国产色综合久久久蜜香臀| 亚欧洲乱码视频| 欧美久久一级| 国产精品美女网站| 天天综合天天综合| 亚洲色图都市小说| 国产野外作爱视频播放| 欧美日韩一本| 欧美俄罗斯性视频| 中文字幕一区二区免费| 久久尤物电影视频在线观看| 成人午夜免费剧场| 日本电影久久久| 亚洲人成亚洲人成在线观看| 永久免费看黄网站| 六月丁香综合在线视频| 欧美三级华人主播| 黄视频网站在线观看| 欧美不卡激情三级在线观看| 久久久久亚洲AV成人无在| 国产亚洲一级| 国产亚洲第一区| 午夜影院免费在线| 69堂国产成人免费视频| 欧美午夜激情影院| 美女91精品| 麻豆传媒一区| 麻豆国产在线| 亚洲国产高清福利视频| 麻豆亚洲av成人无码久久精品| 九九视频精品免费| 中日韩在线视频| 福利精品在线| 中文字幕日韩在线观看| 超碰在线观看91| 久久久三级国产网站| 男人天堂网视频| 欧美色图婷婷| 2019中文字幕在线免费观看| 全国男人的天堂网| 亚洲妇女屁股眼交7| 无码人妻丰满熟妇区毛片蜜桃精品| 天天操夜夜操国产精品| 成人欧美一区二区三区在线| 蜜桃视频在线观看免费视频网站www| 在线观看91精品国产入口| 日本一道本视频| 免费在线看一区| 亚洲国产日韩综合一区| 日本免费一区二区三区等视频| www国产精品视频| 99久久精品国产一区色| 一区二区三区在线看| 亚洲熟妇一区二区| 99国产精品久久久久久久| 国产乱子伦精品| 制服丝袜专区在线| 亚洲天堂av女优| 国产偷人爽久久久久久老妇app| 中文字幕欧美激情| 国产精品久久久久久9999| 欧美精品国产一区| 久久99精品国产一区二区三区| 综合毛片免费视频| 色哟哟亚洲精品一区二区| 国产模特av私拍大尺度| 香蕉av福利精品导航| a级大片在线观看| 精东粉嫩av免费一区二区三区| 成人在线观看www| 国产伦精品一区二区三区免费优势| 91高清视频在线免费观看| 国产精品毛片一区二区三区四区| 欧美日本免费一区二区三区| 国产一级aa大片毛片| 91网上在线视频| av在线网址导航| 国内精品美女在线观看| 欧美尤物一区| 国产精品美女久久久久人| 久久久人成影片一区二区三区观看| 欧美xxx.com| 欧美精品久久99| 91看片在线播放| 中文字幕高清一区| 亚洲av无码专区在线播放中文| 快she精品国产999| www.69av| 日韩久久精品网| 国内成+人亚洲| 日韩午夜电影免费看| 91精品国产91久久久久久最新| 在线观看美女网站大全免费| 亚洲第一视频网| 亚洲熟妇无码久久精品| 欧美日韩视频在线| 欧美被狂躁喷白浆精品| 中文天堂在线一区| 欧美深性狂猛ⅹxxx深喉 | 免费啪视频在线观看| 日韩电影在线看| 亚洲熟妇无码一区二区三区导航| 四虎国产精品免费观看 | 日韩精品一区二区久久| 黄色99视频| 免费精品一区| 国产精品视频免费观看www| 国模精品视频| 久久999免费视频| 嫩草在线视频| 国产亚洲精品久久久久久777| 日韩在线观看视频一区二区三区| 欧美高清视频一二三区 | 欧美一区久久久| 午夜精品久久久久久99热| 久草资源在线| 这里精品视频免费| 黄色国产在线| 亚洲精品国产拍免费91在线| www.av在线.com| 777午夜精品免费视频| 在线观看日批视频| 色婷婷亚洲综合| 成人在线免费看视频| 亚洲电影第三页| 久久精品这里只有精品| 亚洲欧洲日产国码二区| 手机av在线不卡| 亚洲国产精品高清| 国产sm调教视频| 国产视频在线观看一区二区三区| 丝袜美腿中文字幕| 91丨porny丨最新| 亚洲天堂网一区二区| 99久久综合色| 亚洲成人日韩在线| 久久天天做天天爱综合色| 日韩人妻一区二区三区| 26uuu精品一区二区| 成人免费看aa片| 久久婷婷色综合| 亚洲欧美va天堂人熟伦| 国产女人aaa级久久久级| 中文字幕免费在线看线人动作大片| 国产色综合一区| 免费在线观看a视频| 国产精品美女久久久久高潮| 亚洲欧美综合7777色婷婷| 国产精品久久久久aaaa樱花| 国产精品视频看看| 日韩美女精品在线| 欧美精品入口蜜桃| 亚洲福利一二三区| 4438国产精品一区二区| 在线精品视频小说1| 在线观看国产小视频| 8x8x8国产精品| 亚洲国产日韩在线观看| 亚洲激情自拍图| 国产精品影院在线| 久久久国产精彩视频美女艺术照福利 | 日本中文字幕久久| 欧美色国产精品| 国产乱码久久久久| 亚洲成人激情视频| 欧美孕妇性xxxⅹ精品hd| 一本色道久久综合狠狠躁篇怎么玩| 看女生喷水的网站在线观看| 欧美激情aaaa| 欧美xxx网站| 亚洲精品日韩av| 欧美在线导航| 亚洲欧洲在线一区| 激情欧美亚洲| 韩国视频一区二区三区| 国产精品99久久久久久久女警| 亚洲av成人片色在线观看高潮| 亚洲国产精品v| 国产网址在线观看| 在线观看视频一区二区| www日本高清| 亚洲男人的天堂网站| 国产区在线看| 欧亚精品中文字幕| 久久久91麻豆精品国产一区| 另类欧美小说| 亚洲精品二区三区| 国产精品-区区久久久狼| 九九在线精品视频| 免费看污黄网站在线观看| 国产精品剧情在线亚洲| 日韩精品一区二区在线播放| 欧美日韩黄视频| 五月激情婷婷综合| 久久精品视频在线播放| 3d欧美精品动漫xxxx无尽| 91网免费观看| 欧美顶级大胆免费视频| 水蜜桃色314在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 成人av在线播放网址| 肉色超薄丝袜脚交69xx图片| 精品久久香蕉国产线看观看gif| 99久久精品国产一区二区成人| 亚洲欧美国产日韩中文字幕| 女同一区二区免费aⅴ| 国产美女91呻吟求| 欧美极品中文字幕| 国产亚洲综合视频| 国产成人啪免费观看软件| 国产精品久久国产精麻豆96堂| 欧美日韩国产色| 亚洲第九十九页| 久久成人综合视频| 九九热这里有精品| 欧美亚洲丝袜| 国产午夜久久| 国产精品久久久免费观看| 一区二区免费在线| 国产高清在线观看视频| 最近2019中文字幕一页二页| 亚洲四虎影院| 欧美最大成人综合网| 国产欧美成人| 亚洲调教欧美在线| 亚洲丰满少妇videoshd| 亚洲a视频在线| 欧美精品在线观看91| 国产一区二区久久久久| 五月天男人天堂| 九九**精品视频免费播放| 91无套直看片红桃在线观看| 欧美午夜寂寞影院| 国产黄色在线| 国产精品aaaa| 日韩精品免费一区二区在线观看| 热久久精品国产| 国产亚洲成aⅴ人片在线观看 | 久久久一本精品99久久精品66| 国语自产精品视频在线看8查询8| 91亚洲一区二区| 一区二区三区视频在线看| 99久久精品国产成人一区二区 | 日韩第一页在线| 中文字幕21页在线看| 欧美日韩亚洲一区二区三区四区| 三级成人在线视频| 亚洲综合第一区| 在线综合亚洲欧美在线视频| 性欧美高清come| 国产区二精品视| 久久一区精品| 日本黄色激情视频| 日韩欧美一级特黄在线播放| 国模雨婷捆绑高清在线| 久久福利电影| 免费观看成人鲁鲁鲁鲁鲁视频| a一级免费视频| 日韩美女一区二区三区四区| 91福利在线尤物| 热re99久久精品国产99热| 美女一区二区视频| 午夜国产福利一区二区| 亚洲国产成人爱av在线播放| 国产伦精品一区二区三区视频金莲| 台湾成人av| 国产精品白丝av| 六月丁香激情综合| 主播福利视频一区| 人人九九精品视频| 欧美a在线视频| 中文字幕亚洲区| 性猛交xxxx乱大交孕妇印度| 7777kkkk成人观看| 欧美a级成人淫片免费看| 国产精品无码自拍| 色婷婷综合久久久久中文| 99视频免费在线观看| 欧美成人dvd在线视频| 精品夜夜嗨av一区二区三区| 亚洲精品视频在线观看免费视频| 在线电影欧美日韩一区二区私密| 精品伊人久久| 国产一线二线三线在线观看| 亚洲精品国产精品乱码不99| 男男激情在线| 亚洲在线免费看| 日本网站在线观看一区二区三区| 免费三片在线播放| 亚洲最新av在线网站| 99久久香蕉| 日本免费色视频| 欧美性色视频在线| 午夜小视频在线观看| 亚洲欧美精品在线观看| av中文一区二区三区| 国产精品怡红院|