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

相关推荐
郭wes代码1 小时前
纯 CSS+JS 实战:手搓一张支持自定义的通用金色电子奖状(万字详细拆解)
前端·javascript·css
阿黎梨梨1 小时前
React 表单处理与性能优化:从入门到进阶
前端·react.js
Whbbit19991 小时前
发布自己的 shadcn-vue 扩展组件,并支持 CLI 安装
前端·开源
Tian_Hang2 小时前
Vue3 父子组件通讯
前端·javascript·vue.js
breeze jiang2 小时前
React memo、useCallback 与 useMemo:父组件多状态时如何减少无效渲染
前端·javascript·react.js
小黑技术栈2 小时前
Java前端基础到入门——16day
java·开发语言·前端
朱涛的自习室2 小时前
从 Prompt 到 Graph:AI 工程的进化史
android·前端·人工智能
今天的砖头有点烫手啊3 小时前
AI Agent 开发实战(十):Agent 设计模式(ReAct / Plan-Execute / Reflection)
人工智能·react.js·设计模式
敲代码的玉米C3 小时前
让两个模型一写一审
前端·人工智能·架构
代码不加糖4 小时前
common.js和es6中模块引l入的区别?
前端·javascript·es6