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