惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
爱范儿
爱范儿
WordPress大学
WordPress大学
Last Week in AI
Last Week in AI
博客园 - 聂微东
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
罗磊的独立博客
Jina AI
Jina AI

博客园 - 张润昊

项目文档治理方案形成全过程(证据审计版) Codex Subagent :如何隔离 Coding Agent 的上下文 在AI时代, 关于编程的思考 Coding Agent 工程化实践《一》 : 前端页面自验实践 大模型为什么会产生幻觉?从原理到工程防御 Codex 的 Skill 到底是怎么被调用的? Superpowers:如何约束 Coding Agent 使用 Codex 的一次危险提醒 我的Nginx 的配置分析 NextJS 安全漏洞分析 AI工具学习02 - 使用 ChatGPT 进行 PRD 产品设计 NextJS 02 - 服务端渲染 NextJS01 - page router - 问题列表 Flutter02-布局 Flutter01-本地数据库 isar React 学习 03-两种 Api 的使用 React 学习 01-时间切片 安卓低机型卡顿分析以优化方案 命令行 查找某个结尾的文件. 总结下vim快捷键 React技术揭密学习(二) React技术揭密学习(一) Build your own React 前端监控系统博客总结 记账项目 - webpack优化 React源码解携(二): 走一趟render流程 macos更新后, MySQL不能启动问题
React 学习 02-commit 渲染
张润昊 · 2025-07-10 · via 博客园 - 张润昊

React 学习 02-commit 渲染

简单介绍

  • commit 阶段就是把 render 形成的改变一把执行到 dom 上

深度优先遍历

  • render 阶段,会在每个 fiber 上,有一个 effectTag, 还有一个 nextEffect。
  • render 阶段是采用深度优先遍历。
      P
   /  |   \
  A   B    C
  |   |    |
 A1  B1   C1

遍历顺序:

P → A → A1 → B → B1 → C → C1

形成的链表执行顺序

Effect链: A1 → A → B1 → B → C1 → C → P

具体执行过程

  • 会先执行一遍这个链表上的删除操作。
  • 再执行一遍这个链表上的更新/新增的操作。
  • 最后执行一遍 Effect 操作。例如 LayoutEffect

具体的操作

  • 插入节点(新创建的 DOM 节点)
  • 更新节点(已有节点属性更新,比如修改 className、style、textContent 等)
  • 删除节点(从 DOM 移除已删除的 Fiber 节点)
  • 事件绑定与解绑(如绑定新的 onClick,解绑旧事件)
  • 处理 ref 设置(ref.current = dom 节点)

useEffect 和 useLayoutEffect 的区别

useEffect

  • 异步执行,首先是变动 dom,然后浏览器绘制,然后异步执行所有的 useEffect

useLayoutEffect

  • 同步执行,再所有的 dom 变动都完成后,再浏览器绘制之前进行变动。
  • 这里能读取到最新的 dom 信息,然后会卡浏览器的绘制。
  • 因为,浏览器的 js 代码执行和 dom 渲染都是在主线程中!长时间 js 代码执行会阻塞 dom 的渲染!