欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > Reconciler, Commit

Reconciler, Commit

2025/3/11 16:50:19 来源:https://blog.csdn.net/m0_47999208/article/details/146144828  浏览:    关键词:Reconciler, Commit

在 React 的渲染流程中,Reconciler(协调器)阶段和 Commit(提交)阶段是两个关键的步骤,下面为你详细介绍这两个阶段的具体工作内容。

Reconciler 阶段

Reconciler 阶段主要负责找出需要更新的部分,也就是进行虚拟 DOM 的比较(Diff),并生成新的 Fiber 树。这个阶段是可中断的,支持 React 的并发模式,有助于提高应用的响应性能。具体工作如下:

  • 创建或更新 Fiber 节点
    • React 会根据组件的类型(函数组件、类组件、原生 DOM 组件等)创建或更新对应的 Fiber 节点。每个 Fiber 节点代表一个组件实例或 DOM 元素,包含了组件的状态、属性等信息。
    • 例如,当一个函数组件被渲染时,Reconciler 会为其创建一个 Fiber 节点,并将组件的 props 等信息存储在该节点上。
  • Diff 算法执行
    • Reconciler 使用 Diff 算法比较新旧 Fiber 树,找出需要更新、添加或删除的节点。Diff 算法的核心原则是通过对比节点的 key、类型等信息,尽可能复用已有的节点,减少不必要的 DOM 操作。
    • 例如,当一个列表组件的某些项发生变化时,Reconciler 会根据项的 key 来判断哪些项是新增的、哪些项是需要更新的、哪些项是需要删除的。
  • 生成副作用标记
    • 在比较过程中,Reconciler 会为需要进行 DOM 操作的节点添加副作用标记(Side Effect Tag),如插入(Placement)、更新(Update)、删除(Deletion)等。这些标记会在后续的 Commit 阶段被使用。
    • 例如,如果一个新的 DOM 元素需要被插入到页面中,对应的 Fiber 节点会被标记为 Placement。
  • 可中断与调度
    • Reconciler 阶段是可中断的,React 会根据浏览器的剩余时间来决定是否暂停当前的工作,将控制权交还给浏览器,以避免长时间阻塞主线程,保证页面的流畅性。
    • 例如,当浏览器有更高优先级的任务(如用户交互)时,Reconciler 会暂停工作,等浏览器空闲时再继续。

Commit 阶段

Commit 阶段是将 Reconciler 阶段生成的副作用标记应用到真实 DOM 上,并执行一些副作用操作的阶段。这个阶段是同步的,一旦开始就会一直执行直到完成。具体工作如下:

  • BeforeMutation 阶段(DOM 更新前)
    • 执行一些 DOM 更新前的操作,比如调用 useEffect 的清理函数。如果在之前的渲染中使用了 useEffect 并返回了一个清理函数,那么在这个阶段会执行该清理函数,用于清理上一次副作用产生的影响。
    • 例如,当一个组件卸载时,其 useEffect 的清理函数会在这个阶段被调用,以清除定时器、取消网络请求等。
  • Mutation 阶段(DOM 更新)
    • 根据 Reconciler 阶段生成的副作用标记,对真实 DOM 进行插入、更新、删除等操作。将新的 Fiber 树的状态和属性同步到真实的 DOM 上。
    • 例如,如果某个 Fiber 节点被标记为 Placement,那么在这个阶段会将对应的 DOM 元素插入到页面中;如果被标记为 Update,会更新该 DOM 元素的属性和内容。
  • Layout 阶段(DOM 更新后)
    • 执行一些 DOM 更新后的操作,比如调用 useLayoutEffect 的回调函数。useLayoutEffect 会在 DOM 更新后立即同步执行,适合进行一些需要读取最新 DOM 布局信息的操作。
    • 例如,可以在 useLayoutEffect 中获取更新后的 DOM 元素的宽度、高度等信息。
    • 同时,在这个阶段会更新组件的 refs,确保 refs 引用到最新的 DOM 元素。
  • 调度 useEffect
    • 在 Layout 阶段完成后,React 会调度 useEffect 的回调函数。useEffect 的回调函数会在浏览器完成渲染后异步执行,用于处理一些副作用,如数据获取、订阅等。
    • 例如,在组件渲染完成后,可以使用 useEffect 发起一个网络请求来获取数据。

综上所述,Reconciler 阶段主要负责找出需要更新的部分,而 Commit 阶段则负责将这些更新应用到真实 DOM 上,并执行相关的副作用操作。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词