源码分析之React中ReactDOMRoot实现

概览

在React应用的入口会执行createRoot方法,而createRoot方法最后会返回ReactDOMRoot的实例对象

js 复制代码
function createRoot(){
  ....
  return new ReactDOMRoot(options)
}

本文主要介绍ReactDOMRoot的实现。

源码分析

ReactDOMRooT就是一个普通的函数,在其原型上定义了renderunmount方法,分别用于挂载渲染子节点和卸载应用。

js 复制代码
function ReactDOMRoot(internalRoot) {
  // 存储内部的Fiber 根节点
  this._internalRoot = internalRoot;
}

/**
 * createRoot(div).render(<App/>) render方法的实现就是如下
 */
ReactDOMRoot.prototype.render =
  function (children) {
    // 获取内部根节点
    var root = this._internalRoot;
    // 确保根节点存在
    if (null === root) throw Error(formatProdErrorMessage(409));
    // 获取当前的Fiber树根节点
    var current = root.current,
    // 请求一个更新车道:优先级
      lane = requestUpdateLane();
    // 调用 updateContainerImpl更新容器  
    updateContainerImpl(current, lane, children, root, null, null);
};

/**
 * unmount方法:卸载应用的方法,会清理整个React应用
 */
ReactDOMRoot.prototype.unmount =
  function () {
    var root = this._internalRoot;
    // 若根节点存在,则执行卸载
    if (null !== root) {
      // 清空内部节点引用
      this._internalRoot = null;
      // 获取容器DOM元素
      var container = root.containerInfo;
      // 第三个参数为null,表示卸载所有子节点,lane=2表示同步更新
      updateContainerImpl(root.current, 2, null, root, null, null);
      
      // 强制同步刷新工作,确保立即卸载
      flushSyncWork$1();
      
      // 清理容器DOM元素上的内部实例标记
      container[internalContainerInstanceKey] = null;
    }
};
相关推荐
Hamm11 小时前
前端转Java+AI全栈?那我推荐几个实战开源项目给你
前端·后端·全栈
饼干哥哥11 小时前
十年数据分析经验,被我打包成了4个跨境VOC Skill
前端·数据分析·数据可视化
东方小月12 小时前
从零开发一个 Coding Agent(六):实现一个可脚本化的 Faux Provider
前端·人工智能
程序员黑豆12 小时前
什么是JDK以及JDK都由哪些部分组成呢
java·前端·ai编程
妙码生花12 小时前
让各大 AI 整理出来的前端工程命名最简实践(Vue + TS)
前端·javascript·vue.js
郭wes代码13 小时前
纯 CSS+JS 实战:手搓一张支持自定义的通用金色电子奖状(万字详细拆解)
前端·javascript·css
用户8471810541914 小时前
DeepAgents.js 教程 06—— 跨会话长期记忆(Memory与AGENTS.md)
javascript·agent
阿黎梨梨14 小时前
React 表单处理与性能优化:从入门到进阶
前端·react.js
Whbbit199914 小时前
发布自己的 shadcn-vue 扩展组件,并支持 CLI 安装
前端·开源
Tian_Hang14 小时前
Vue3 父子组件通讯
前端·javascript·vue.js