摘要:先檢驗(yàn)是否存在不存在則執(zhí)行傳入,后的函數(shù)創(chuàng)建一個。方法更新執(zhí)行方法,這個方法最終調(diào)用和并返回,這些進(jìn)行調(diào)度算法和進(jìn)行優(yōu)先級判斷
1.步驟 1.創(chuàng)建ReactRoot 2.創(chuàng)建FiberRoot和FiberRoot 3.創(chuàng)建更新 2. render方法:
render( element: React$Element, container: DOMContainer, callback: ?Function, ) { invariant( isValidContainer(container), "Target container is not a DOM element.", ); return legacyRenderSubtreeIntoContainer( null, element, container, false, callback, ); },
render方法可以傳入三個參數(shù)包括ReactElement、DOM的包裹節(jié)點(diǎn),和渲染結(jié)束后執(zhí)行的回調(diào)方法。
然后驗(yàn)證invariant驗(yàn)證container是否是有效的Dom節(jié)點(diǎn)。
最后返回legacyRenderSubtreeIntoContainer方法執(zhí)行后的結(jié)果,再來看看這個方法的參數(shù)
function legacyRenderSubtreeIntoContainer( parentComponent: ?React$Component, children: ReactNodeList, container: DOMContainer, forceHydrate: boolean, callback: ?Function, )
這里傳入五個參數(shù),第一個是parentComponent不存在傳入null,第二個是傳入container的子元素,第三個是創(chuàng)建ReactRoot的包裹元素,第四個是協(xié)調(diào)更新的選項,第五個是渲染后的回調(diào)方法。
let root: Root = (container._reactRootContainer: any); if (!root) { // Initial mount root = container._reactRootContainer = legacyCreateRootFromDOMContainer( container, forceHydrate, );
先檢驗(yàn)ReactRoot是否存在不存在則執(zhí)行傳入container,
forceHydrate后的legacyCreateRootFromDOMContainer函數(shù)創(chuàng)建一個ReactRoot。forceHydrate在render方法中傳入的false,在Hydrate方法中傳入的true,主要是為了區(qū)分服務(wù)端渲染和客戶端渲染,true時未復(fù)用原來的節(jié)點(diǎn)適合服務(wù)端渲染,
如果是false則執(zhí)行container.removeChild(rootSibling)刪除所有的子節(jié)點(diǎn)。
然后返回通過 new ReactRoot(container, isConcurrent, shouldHydrate):
function ReactRoot( container: DOMContainer, isConcurrent: boolean, hydrate: boolean, ) { const root = createContainer(container, isConcurrent, hydrate); this._internalRoot = root; }
在這個方法中調(diào)用createContainer創(chuàng)建root,這個方法從react-reconciler/inline.dom文件中引入:
export function createContainer( containerInfo: Container, isConcurrent: boolean, hydrate: boolean, ): OpaqueRoot { return createFiberRoot(containerInfo, isConcurrent, hydrate); }
在這個方法中又調(diào)用了createFiberRoot方法創(chuàng)建FiberRoot
在創(chuàng)建玩root后執(zhí)行unbatchedUpdates更新,傳入root。render方法更新:
unbatchedUpdates(() => { if (parentComponent != null) { root.legacy_renderSubtreeIntoContainer( parentComponent, children, callback, ); } else { root.render(children, callback); } });
執(zhí)行updateContainer(children, root, null, work._onCommit);方法,這個方法最終調(diào)用enqueueUpdate和scheduleWork,并返回expireTime,這些進(jìn)行調(diào)度算法和進(jìn)行優(yōu)先級判斷
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/103185.html
摘要:本文將對源碼做一個初步解析。首先在方法中校驗(yàn)參數(shù)是否合法,然后調(diào)用在中,調(diào)用拿到了的一個實(shí)例,調(diào)用拿到了,用于注入到,和作為返回值,調(diào)用開始調(diào)度過程在中,首先清理了中的所有子節(jié)點(diǎn),然后了一個并返回是如何調(diào)度的是一個什么樣的類的操作是在哪里 初步看了react-dom這個包的一些源碼,發(fā)現(xiàn)其比react包要復(fù)雜得多,react包中基本不存在跨包調(diào)用的情況,他所做的也僅僅是定義了React...
摘要:在中調(diào)用獲得了的實(shí)例,然后調(diào)用其中的回調(diào)函數(shù)中調(diào)用了方法。這個類主要介紹其構(gòu)造函數(shù)和方法,構(gòu)造函數(shù)是時調(diào)用的,方法是的回調(diào)函數(shù)中使用的。這個將在下一篇分析。另外,方法是在的回調(diào)函數(shù)中調(diào)用的,也是一個參與后面調(diào)度的關(guān)鍵。 在ReactDOM.render源碼解析-1中介紹了第一次render的基本過程的一部分,其中產(chǎn)生了ReactRoot和ReactWork兩個類的實(shí)例。本文介紹下Rea...
摘要:查看創(chuàng)建核心函數(shù)源碼行調(diào)用函數(shù)創(chuàng)建是相關(guān),不用管源碼行這個指的是調(diào)用創(chuàng)建,下面我們將會說到對象源碼行源碼行函數(shù)中,首先創(chuàng)建了一個,然后又創(chuàng)建了一個,它們兩者還是相互引用。 感謝 yck: 剖析 React 源碼解析,本篇文章是在讀完他的文章的基礎(chǔ)上,將他的文章進(jìn)行拆解和加工,加入我自己的一下理解和例子,便于大家理解。覺得yck寫的真的很棒 。React 版本為 16.8.6,關(guān)于源碼的...
摘要:并不是組件中的任何地方都能夠使用獲取結(jié)構(gòu),只對掛載后的組件生效。組件的一個特殊屬性,接受一個回調(diào)函數(shù)作為參數(shù)。反之,則表示卸載失敗。再看一下這段代碼這個回調(diào)函數(shù)其實(shí)是沒有參數(shù)的,但是,當(dāng)方法變成異步方法之后,說不定就會向其注入一些參數(shù)了。 在react的組件的開發(fā)過程中,一般來說,我們并不會真正的去操作dom。只有在頂層組件的渲染的過程中,我們借助ReactDOM.render()方法...
摘要:系列系列簡單模擬語法一系列合成事件與二系列算法實(shí)現(xiàn)分析三系列從到再到四系列與部分源碼解析五系列從使用了解的各種使用方案六前言我們先不講什么語法原理先根據(jù)效果強(qiáng)行模擬語法使用實(shí)現(xiàn)一個簡易版的第一步我們先用類 React系列 React系列 --- 簡單模擬語法(一)React系列 --- Jsx, 合成事件與Refs(二)React系列 --- virtualdom diff算法實(shí)現(xiàn)分析...
閱讀 3115·2023-04-26 00:40
閱讀 2473·2021-09-27 13:47
閱讀 4443·2021-09-07 10:22
閱讀 3012·2021-09-06 15:02
閱讀 3366·2021-09-04 16:45
閱讀 2556·2021-08-11 10:23
閱讀 3654·2021-07-26 23:38
閱讀 2938·2019-08-30 15:54