這篇文章帶給大家的內容是關於ReactDom.render的詳細解析,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
步驟
1.建立ReactRoot
#2.建立FiberRoot和FiberRoot
3.建立更新
#render方法:
render( element: React$Element<any>, container: DOMContainer, callback: ?Function, ) { invariant( isValidContainer(container), 'Target container is not a DOM element.', ); return legacyRenderSubtreeIntoContainer( null, element, container, false, callback, ); },
render方法可以傳入三個參數包含ReactElement、DOM的包裹節點,和渲染結束後執行的回呼方法。
接著驗證invariant
驗證container是否是有效的Dom節點。
最後回傳legacyRenderSubtreeIntoContainer
方法執行後的結果,再來看看這個方法的參數
function legacyRenderSubtreeIntoContainer( parentComponent: ?React$Component<any, any>, children: ReactNodeList, container: DOMContainer, forceHydrate: boolean, callback: ?Function, )
這裡傳入五個參數,第一個是parentComponent不存在傳入null,第二個是傳入container的子元素,第三個是創建ReactRoot的包裹元素,第四個是協調更新的選項,第五個是渲染後的回調方法。
let root: Root = (container._reactRootContainer: any); if (!root) { // Initial mount root = container._reactRootContainer = legacyCreateRootFromDOMContainer( container, forceHydrate, );
先檢驗ReactRoot是否存在不存在則執行傳入container,
forceHydrate後的legacyCreateRootFromDOMContainer
函數建立一個ReactRoot。 forceHydrate在render方法中傳入的false,在Hydrate方法中傳入的true,主要是為了區分服務端渲染和客戶端渲染,true時未復用原來的節點適合服務端渲染,
如果是false則執行container.removeChild(rootSibling)
刪除所有的子節點。
然後回傳透過new ReactRoot(container, isConcurrent, shouldHydrate)
:
function ReactRoot( container: DOMContainer, isConcurrent: boolean, hydrate: boolean, ) { const root = createContainer(container, isConcurrent, hydrate); this._internalRoot = root; }
在這個方法中呼叫createContainer
建立root,這個方法從 react-reconciler/inline.dom
檔案中引入:
export function createContainer( containerInfo: Container, isConcurrent: boolean, hydrate: boolean, ): OpaqueRoot { return createFiberRoot(containerInfo, isConcurrent, hydrate); }
在這個方法中又呼叫了createFiberRoot
方法建立FiberRoot
在建立玩root後執行 unbatchedUpdates
更新,傳入root。 render方法更新:
unbatchedUpdates(() => { if (parentComponent != null) { root.legacy_renderSubtreeIntoContainer( parentComponent, children, callback, ); } else { root.render(children, callback); } });
執行updateContainer(children, root, null, work._onCommit);
方法,這個方法最終呼叫enqueueUpdate
和scheduleWork
,並返回expireTime,這些進行調度演算法和進行優先權判斷
【相關推薦:react影片教學】
以上是ReactDom.render的詳細解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!