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

推荐订阅源

Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
量子位
腾讯CDC
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
The Hacker News
The Hacker News
T
The Exploit Database - CXSecurity.com
B
Blog
S
SegmentFault 最新的问题
P
Privacy & Cybersecurity Law Blog
T
Threatpost
博客园 - 聂微东
T
Tailwind CSS Blog
The Last Watchdog
The Last Watchdog
C
Check Point Blog
N
Netflix TechBlog - Medium
D
DataBreaches.Net
爱范儿
爱范儿
IT之家
IT之家
S
Secure Thoughts
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
C
Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
有赞技术团队
有赞技术团队
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
Schneier on Security
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
雷峰网
雷峰网
Project Zero
Project Zero
博客园 - Franky
H
Heimdal Security Blog
A
About on SuperTechFans
Security Latest
Security Latest
Webroot Blog
Webroot Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - 张润昊

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 的渲染!