React源码解析-第三部分:协调与提交

图 6:reconcileChildren 子节点比对细节(单节点与多节点)

📝 解析

reconcileChildren 是整个协调阶段最核心的函数。对于单节点 ,比较 typekey 决定复用还是替换。对于多节点(数组) ,是否使用 key 导致算法分叉:有 key 时采用三阶段优化算法 (移动、新增、删除),时间复杂度 O(n);无 key 时则退化到按索引遍历,容易因顺序错乱导致大量子组件重新挂载。

图 7:提交阶段(Commit Phase)的三个子阶段

📝 解析

提交阶段被拆分为三个严格的同步子阶段,不可中断:

  1. Before Mutation:在 DOM 变更前读取状态(如滚动位置),此阶段可安全访问旧的 DOM。

  2. Mutation :执行所有 DOM 操作(增删改),并将 ref 更新为指向新 DOM。

  3. Layout :立即执行 useLayoutEffect 和类组件的 componentDidMount/Update

    这三个阶段保证了副作用执行的确定性,且 useLayoutEffect 的同步阻塞特性使其适用于读取布局尺寸。

图 8:类组件生命周期 & 函数组件 Hooks 的执行时序

📝 解析

这张图厘清了类组件与函数组件的时序等价关系

关键区别useEffect 的回调在浏览器绘制之后异步执行 (不阻塞屏幕更新),而 useLayoutEffect 与类组件的 componentDidMount 在绘制前同步执行getSnapshotBeforeUpdate 返回的值会作为 componentDidUpdate 的第三个参数,常用于记录滚动位置。

相关推荐
kyriewen24 分钟前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试
IT_陈寒1 小时前
Vue的双向绑定把我坑惨了,原来这个场景不能用
前端·人工智能·后端
hunterandroid2 小时前
[Android 从零到一] Compose LazyColumn 性能优化:key、稳定性与重组治理
android·前端
lichenyang4532 小时前
从一次团队邀请开始:用 React、NestJS 与 Socket.IO 做可靠的实时通知
前端
vtian2 小时前
一篇文章吃透 Monorepo:pnpm + Turborepo + Changesets 全流程实战(含 8 个踩坑)
前端
默_笙2 小时前
❗ 点击计数按钮,为什么"峨眉队"也跟着重新渲染?React.memo 说:我记住了
前端·javascript
31535669133 小时前
DeepSeek Harness 发布后,我没急着跑 Demo,先把 `.agents/` 翻了一遍
前端·后端·github
名字还没想好☜3 小时前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js
学习zhao极致it3 小时前
2020全新React教程全家桶实战redux+antd+React Hooks前端js视频
前端
用户921080262863 小时前
Bubble 消息操作区改造:复制、重新生成和反馈
前端