详细概括 React 新版本(16)初始渲染流程

核心过程:JSX -> babel -> createElement -> ReactElement -> render -> workInProgress Fiber -> commit -> getSnapShotBeforeUpdate -> dom ->lifeCircle/hook

逻辑细节:

1. jsx 转换成 react 元素

  • babel-react 会将jsx 调用 React.createElement
  • React.createElement 会 jsx 转换成 react element (react element 就是 一个用来描述react 元素的对象。)

2. render (协调层)此阶段负责创建 Fiber 数据结构并为 Fiber 节点打标记,标记当前 Fiber 节点要进行的 DOM 操作。

       首先为每一个react 元素构建 fiber 对象 (workInProgress Fiber 树)创建 此 fiber 对象对应的 DOM 对象,为 fiber 对象添加 effectTag 属性(用来记录当前 Fiber 要执行的 DOM 操作),然后在render 结束后, fiber 会被保存到 fiberroot 中。

代码层步骤:

  • 将子树渲染到容器中 (初始化 Fiber 数据结构: 创建 fiberRoot 及 rootFiber)
  • 判断是否为服务器端渲染 如果不是服务器端渲染,清空 container 容器中的节点
  • 通过实例化 ReactDOMBlockingRoot 类创建 LegacyRoot,创建 LegacyRoot 的 Fiber 数据结构
  • 创建 container,创建根节点对应的 fiber 对象
  • 获取 container 的第一个子元素的实例对象
  • 计算任务的过期时间,再根据任务过期时间创建 Update 任务,将任务(Update)存放于任务队列(updateQueue)中。判断任务是否为同步 调用同步任务入口。
  • 构建 workInProgress Fiber 树

3. commit 阶段 (渲染层)

  1. 先获取到render 的结果, 在 fiberroot 中的 新构建的 workInProgress Fiber 树
  2. 根据 fiber 中的 effectTag 属性进行相应的 DOM 操作

猜你喜欢

转载自blog.csdn.net/weixin_40599109/article/details/112580092