摘要:查看創(chuàng)建核心函數(shù)源碼行調(diào)用函數(shù)創(chuàng)建是相關(guān),不用管源碼行這個指的是調(diào)用創(chuàng)建,下面我們將會說到對象源碼行源碼行函數(shù)中,首先創(chuàng)建了一個,然后又創(chuàng)建了一個,它們兩者還是相互引用。
感謝 yck: 剖析 React 源碼解析,本篇文章是在讀完他的文章的基礎(chǔ)上,將他的文章進行拆解和加工,加入我自己的一下理解和例子,便于大家理解。覺得yck寫的真的很棒 。React 版本為 16.8.6,關(guān)于源碼的閱讀,可以移步到y(tǒng)ck react源碼解析本文永久有效鏈接: react解析 render的FiberRoot(三)
圖片描述
下面將會說到 ReactDOM.render 在ReactDOM中的調(diào)用流程,實際就是分析下面代碼:
ReactDOM.render(, document.getElementById("app"))
實際代碼:
ReactDOM.render(React.createElement(APP, null), document.getElementById("app"));render 函數(shù)
yck: ReactDOM 源碼 702行 render
ReactDOM.render實際調(diào)用的就是下面的代碼
render( element: React$Element, container: DOMContainer, callback: ?Function, ) { // 注意下 forceHydrate 參數(shù),為 true 時是服務(wù)端渲染 // 客戶端調(diào)用 render 函數(shù)的話這個值永遠(yuǎn)為 false return legacyRenderSubtreeIntoContainer( null, element, container, false, callback, ); }
render函數(shù)中的參數(shù)element是 傳入的組件,containerDOM節(jié)點容器,callback是回調(diào)函數(shù)。ReactDOM.render文檔。
legacyRenderSubtreeIntoContainer 函數(shù)yck: ReactDOM 源碼 554行 legacyRenderSubtreeIntoContainer
function legacyRenderSubtreeIntoContainer( parentComponent: ?React$Component, children: ReactNodeList, container: DOMContainer, forceHydrate: boolean, callback: ?Function, ) { // 初始化時,container 肯定沒有 _reactRootContainer屬性 let root: Root = (container._reactRootContainer: any); if (!root) { root = container._reactRootContainer = legacyCreateRootFromDOMContainer( container, // DOM容器節(jié)點 forceHydrate, // 為false ); // 暫時只說root不存在時,reactRoot的創(chuàng)建 } }
container表示DOM元素節(jié)點容器, 在上面的代碼中會創(chuàng)建一個ReactRoot,然后將它掛載在container容器上, container._reactRootContainer就是掛載的ReactRoot屬性。
// 查看_reactRootContainer document.getElementById("app")._reactRootContainer創(chuàng)建FiberRoot核心函數(shù)
yck: ReactDOM 源碼 504行 legacyCreateRootFromDOMContainer
function legacyCreateRootFromDOMContainer( container: DOMContainer, forceHydrate: boolean, ): Root { const isConcurrent = false; // 調(diào)用ReactRoot函數(shù) 創(chuàng)建ReactRoot, shouldHydrate是SSR相關(guān),不用管 return new ReactRoot(container, isConcurrent, shouldHydrate); }
yck: ReactDOM 源碼 368行 ReactRoot
function ReactRoot( container: DOMContainer, isConcurrent: boolean, hydrate: boolean, ) { // 這個 root 指的是 FiberRoot const root = createContainer(container, isConcurrent, hydrate); this._internalRoot = root; }
調(diào)用createContainer 創(chuàng)建FiberRoot,下面我們將會說到FiberRoot 對象
FiberRootyck: ReactDOM 源碼 368行 createContainer
export function createContainer( containerInfo: Container, isConcurrent: boolean, hydrate: boolean, ): OpaqueRoot { return createFiberRoot(containerInfo, isConcurrent, hydrate); }
yck: ReactDOM 源碼 368行 createFiberRoot
function createFiberRoot( containerInfo: any, isConcurrent: boolean, hydrate: boolean, ): FiberRoot { const root: FiberRoot = (new FiberRootNode(containerInfo, hydrate): any); const uninitializedFiber = createHostRootFiber(isConcurrent); root.current = uninitializedFiber; uninitializedFiber.stateNode = root; return root; }
createFiberRoot函數(shù)中,首先創(chuàng)建了一個root: FiberRoot,然后又創(chuàng)建了一個uninitializedFiber: RootFiber,它們兩者還是相互引用。
// 查看 FiberRoot 對象 document.getElementById("app")._reactRootContainer._internalRoot
我們下面順便說一下FiberRoot 和 RootFiber的關(guān)系,同時拿出幾個必須要要了解的屬性解釋一下。
ReactDom.render( ()=> (), document.querySelector("#root") )
以上圖片中只有FiberRoot的部分屬性,想了解更多,可以查看FiberRoot的數(shù)據(jù)結(jié)構(gòu)哦??!
更多內(nèi)容:
react解析: React.createElement(一)
react解析: React.Children(二)
參考:
yck: 剖剖析 React 源碼
Jokcy 的 《React 源碼解析》: react.jokcy.me/
ps: 順便推一下自己的個人公眾號:Yopai,有興趣的可以關(guān)注,每周不定期更新,分享可以增加世界的快樂
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106617.html
摘要:一更新的方式有三種渲染接下來,我們就來看下源碼二作用在提供的里渲染一個元素,并返回對該組件的引用常見的用法是這個官網(wǎng)網(wǎng)址源碼服務(wù)端使用方法渲染節(jié)點是讓服務(wù)端盡可能復(fù)用節(jié)點,提高性能元素容器應(yīng)用渲染結(jié)束后,調(diào)用的函數(shù)錯誤抓取方法本質(zhì)是返回 showImg(https://segmentfault.com/img/remote/1460000020064414?w=1240&h=641);...
摘要:就是,如果你不了解這個的話可以閱讀下相關(guān)文檔,是應(yīng)用初始化時就會生成的一個變量,值也是,并且這個值不會在后期再被改變。這是我的剖析 React 源碼的第三篇文章,如果你沒有閱讀過之前的文章,請務(wù)必先閱讀一下 第一篇文章 中提到的一些注意事項,能幫助你更好地閱讀源碼。 文章相關(guān)資料 React 16.8.6 源碼中文注釋,這個鏈接是文章的核心,文中的具體代碼及代碼行數(shù)都是依托于這個倉庫 熱身...
摘要:是整個應(yīng)用的起點,包含應(yīng)用掛載的目標(biāo)節(jié)點,記錄整個應(yīng)用更新過程的各種信息是一個對象是當(dāng)前應(yīng)用對應(yīng)的對象,即。每個節(jié)點會對應(yīng)一個對象,記錄節(jié)點的各種狀態(tài),比如,,這些狀態(tài)更新完成后會被更新,是所對應(yīng)節(jié)點的實際的實例,比如對應(yīng)一個就是一個。 ReactDom.render做了什么 首先react代碼分為react和react-dom兩個包,react中代碼量特別的少,基本就是API的定義,...
摘要:大家可以看到是構(gòu)造函數(shù)構(gòu)造出來的,并且內(nèi)部有一個對象,這個對象是本文接下來要重點介紹的對象,接下來我們就來一窺究竟吧。在構(gòu)造函數(shù)內(nèi)部就進行了一步操作,那就是創(chuàng)建了一個對象,并掛載到了上。下一篇文章還是流程相關(guān)的內(nèi)容。這是我的剖析 React 源碼的第二篇文章,如果你沒有閱讀過之前的文章,請務(wù)必先閱讀一下 第一篇文章 中提到的一些注意事項,能幫助你更好地閱讀源碼。 文章相關(guān)資料 React ...
摘要:先檢驗是否存在不存在則執(zhí)行傳入,后的函數(shù)創(chuàng)建一個。方法更新執(zhí)行方法,這個方法最終調(diào)用和并返回,這些進行調(diào)度算法和進行優(yōu)先級判斷 1.步驟 1.創(chuàng)建ReactRoot 2.創(chuàng)建FiberRoot和FiberRoot 3.創(chuàng)建更新 2. render方法: render( element: React$Element, container: DOMContainer, ...
閱讀 2385·2021-11-18 10:07
閱讀 2336·2021-09-22 15:59
閱讀 3095·2021-08-23 09:42
閱讀 2296·2019-08-30 15:44
閱讀 1208·2019-08-29 15:06
閱讀 2335·2019-08-29 13:27
閱讀 1230·2019-08-29 13:21
閱讀 1431·2019-08-29 13:13