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

相关推荐
狗凯之家源码网9 分钟前
电商代付系统从零搭建与实战指南
前端·后端·开源
小雨下雨的雨12 分钟前
通过鸿蒙PC Electron框架技术完成-井字棋游戏 - 实现详解
前端·javascript·游戏·华为·electron·鸿蒙
meilindehuzi_a14 分钟前
掌握 ES6 核心语法与大模型(NLP)项目工程化搭建指南
前端·自然语言处理·es6
IT_陈寒21 分钟前
Vue组件通信这个坑我跳了两次才知道怎么爬出来
前端·人工智能·后端
smallswan28 分钟前
第十四 算数运算
linux·服务器·前端
AI_零食28 分钟前
甄嬛人物日志-朗读升级 - 鸿蒙PC Electron框架完整技术实现指南
前端·学习·华为·electron·鸿蒙·鸿蒙系统
HackTwoHub28 分钟前
WEB扫描器Invicti-Professional-V26.50.0(自动化爬虫扫描)更新
前端·人工智能·chrome·爬虫·web安全·网络安全·自动化
copyer_xyf30 分钟前
Python 文件基本操作
前端·后端·python
丑过三八线30 分钟前
Umi 配置文件 .umirc.ts 详解
linux·运维·ubuntu·react.js
x***r15141 分钟前
linux安装 redis-5.0.5.tar.gz 详细步骤(源码编译、配置、启动)
前端