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

相关推荐
蜗牛攻城狮1 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀3 小时前
Vue插槽
前端·javascript·vue.js
qq_448011163 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan3 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352904 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝4 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing035 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel5 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放5 小时前
Python基础语法练习题(73)
java·前端·python
鸿蒙开发6 小时前
Three.js 首帧卡顿排查:compileAsync 之后,为什么还会停一下?
react.js·three.js