【React】setState 触发渲染的流程

概述

setState 本质是向 React Fiber 树中加入一个更新(update),触发调度(schedule),在协调阶段(reconciliation)通过 diff 算法计算变更,最终在提交阶段(commit)更新 DOM。

text 复制代码
setState
  ↓
创建 update 对象
  ↓
加入 Fiber updateQueue
  ↓
调度更新(schedule)
  ↓
render 阶段(diff)
  ↓
commit 阶段(更新 DOM)

详细流程

创建 update

ts 复制代码
const update = {
  payload: newState,
  lane: priority
};

加入更新队列

ts 复制代码
fiber.updateQueue.enqueue(update);

调度更新

ts 复制代码
scheduleUpdateOnFiber(fiber);

React 18 使用 Lane 模型来管理优先级(替代 expirationTime)

为什么 setState 会导致组件重新执行?

因为:

  • Fiber 标记为"需要更新"
  • React 会重新执行函数组件(或 class render)
ts 复制代码
function App() {
  // setState 后,这个函数会重新执行
}

rerender 是"函数重新执行",不是 DOM 直接更新
React diff 是基于"同层 + key + 类型"的算法

render vs commit

render 阶段(可中断)

  • 计算 diff
  • 构建 Fiber 树

commit 阶段(不可中断)

  • 更新 DOM
  • 执行副作用(useEffect)

commit 是同步执行的,保证 UI 一致性

相关推荐
FreeTinker4 小时前
HTML本地存储技术解析:localStorage与sessionStorage的原理、差异与应用场景
前端·html
qq_452396234 小时前
第十二篇:《全链路监控与可观测性:前端错误追踪与性能分析》
前端
wangruofeng5 小时前
Phosphor Icons 官网源码拆解:URL 即存储、水波动画与 7362 Star 图标库的架构实践
前端·架构·github
BigTopOne6 小时前
WebRTC Native / Android 开发学习资源整理
前端
excel7 小时前
nuxt 3 升级 nuxt 4 报错之 hasInjectionContext
前端
何以解忧,唯有..7 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
软件聚导航8 小时前
「聚小软 AI 助手」技术升级:从数据库检索到 RAG 知识库问答
前端·数据库·mysql·微信小程序·小程序·ai编程·rag
恋猫de小郭8 小时前
看懂大模型架构术语,帮助你理解目前常见的大模型开源架构
前端·人工智能·ai编程
yma168 小时前
通过提示词实现GitHub Pages 和 Nginx 双部署竟然这么简单?
前端
前端 贾公子9 小时前
第09章:上下文与记忆 (2)
java·服务器·前端