【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 一致性

相关推荐
deli0073 分钟前
Skill 怎么写才被 Agent 命中?18 条规则做成 SKILL.md 校验器,规范样例 92 分
前端
Hum8le4 分钟前
CTF题目《easy_web》(安洵杯 2019 变种 Web)
前端·安全·web安全
coding漫漫长路4 分钟前
二值化后还剩1212个黑点,OCR却认成了乱码
前端
不可能片场6 分钟前
AI视频口型对齐 用音频驱动说话镜头
前端·electron
Lank_M7 分钟前
OCR一个字没认错,倾斜2.5°却把行序排乱了
前端
daols8810 分钟前
vue 表格组件 vxe-table 实现自定义多行编辑功能
前端·javascript·vue.js·vxe-table
不要试图纠正别人14 分钟前
别让大模型算钱:我把优惠券组合优化写成了确定性算法
前端
IT_Octopus40 分钟前
【零基础入门 LLM 开发 · Day 11】:ChatOpenAI vs init_chat_model——一行换供应商
java·前端·javascript
柚yuzumi42 分钟前
React 19 Hooks 入门:函数组件的四大法宝 (useState / useEffect / useRef / useContext)
前端·javascript·架构
deli0071 小时前
撒下 200 个种子点,平面为什么自己长成蜂窝?Voronoi 图实验室
前端