let root: Root = (container._reactRootContainer: any); if (!root) { // Initial mount root = container._reactRootContainer = legacyCreateRootFromDOMContainer( container, forceHydrate, );先检验ReactRoot是否存在不存在则执行传入container,
legacyCreateRootFromDOMContainer
函数创建一个ReactRoot。forceHydrate在render方法中传入的false,在Hydrate方法中传入的true,主要是为了区分服务端渲染和客户端渲染,true时未复用原来的节点适合服务端渲染,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视频教程】