您的当前位置:首页正文

ReactDom.render的详细解析

2020-11-27 来源:易榕旅网

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);方法,这个方法最终调用enqueueUpdatescheduleWork,并返回expireTime,这些进行调度算法和进行优先级判断

【相关推荐:react视频教程】

显示全文