0

0

React 虚拟 DOM 更新机制详解:状态变更如何触发精准重渲染

霞舞

霞舞

发布时间:2026-02-23 12:21:01

|

182人浏览过

|

来源于php中文网

原创

React 虚拟 DOM 更新机制详解:状态变更如何触发精准重渲染

React 并不会在每次状态更新时重建整个组件树的虚拟 DOM;它仅重新执行状态变更组件及其子组件的 render 函数,生成局部新虚拟节点,并通过高效 diff 算法比对差异,最终只更新真实 DOM 中真正变化的部分。

react 并不会在每次状态更新时重建整个组件树的虚拟 dom;它仅重新执行**状态变更组件及其子组件**的 render 函数,生成局部新虚拟节点,并通过高效 diff 算法比对差异,最终只更新真实 dom 中真正变化的部分。

React 的渲染机制常被简化为“每次 setState 重建整个虚拟 DOM”,但这是一种常见误解。实际上,React 的更新是自顶向下、逐层收敛、按需触发的精细化过程。

渲染起点:从状态变更组件开始

当某个组件(例如 D)调用 setState 或触发 useState 更新时,React 会将该组件标记为“待更新”。随后,React 从该组件开始,自上而下执行其 render 函数(即函数组件体或类组件的 render() 方法),并递归调用其所有子组件的 render 函数——但仅限于该组件的子树范围内

以如下组件结构为例:

function A() { return <B />; }
function B() { return <C />; }
function C() { return <D />; }
function D() {
  const [count, setCount] = useState(0);
  return <div>Count: {count}</div>;
}

若仅 D 内部状态更新,React 不会执行 A、B、C 的 render 函数(前提是它们未被显式标记为需更新,如未使用 useEffect 触发父级重渲染,也未接收新 props)。但注意:由于 C 是 D 的直接父组件,而 D 是 C 的返回内容,React 在协调(reconciliation)过程中仍需访问 C 的 render 结果——不过此处 C 是纯函数且无状态/副作用,React 可通过 React.memo 或自动浅比较跳过其重新执行(详见后文)。

更准确地说:
✅ React 一定重新执行:D(状态源)及其所有子组件(如有);
⚠️ React 可能跳过执行:C、B、A —— 若它们是纯函数组件且 props 未变,React 会在协调阶段直接复用上次的 ReactElement 对象,避免不必要计算。

虚拟 DOM 的“生成”本质是 JSX 执行结果

所谓“生成新的虚拟 DOM”,实质是执行组件函数后返回的 React.createElement() 调用链结果(即 ReactElement 对象树)。例如:

// D 组件更新后重新执行:
function D() {
  const [count, setCount] = useState(1); // 新值
  return React.createElement('div', null, 'Count: ', count);
  // → 返回一个新的 ReactElement 对象(与上次不同)
}

这个新对象构成 D 子树的局部虚拟 DOM 片段,而非全局树。

讯飞听见会议
讯飞听见会议

科大讯飞推出的AI智能会议系统

下载

Diffing 过程:局部比对,非全量重建

React 的协调器(Reconciler)拿到 D 上次的 ReactElement(旧树片段)和本次新生成的 ReactElement(新树片段)后,执行深度优先、同层比较(same-level only) 的 diff 算法:

  • 比较 type(如 'div')、key、props(含 children);
  • 若 type 不同(如 div → span),直接卸载旧子树,挂载新子树;
  • 若 type 相同,则递归 diff 其 props.children;
  • 对列表元素,借助 key 实现移动识别,避免错误复用。

关键点:diff 作用域严格限定在被更新组件的输出子树内,不会跨到兄弟分支(如 C 的另一个子组件 E)或祖先组件。

性能保障:默认优化与主动控制

React 默认提供两层防护避免过度渲染:

  • 函数组件 props 浅比较:若父组件(如 C)未改变 props,且自身无状态,React 可跳过其 render(需配合 React.memo 显式声明);
  • shouldComponentUpdate / React.memo / useMemo / useCallback:开发者可进一步约束子树更新边界。

示例:防止 C 因父级无关更新而重渲染

const C = React.memo(() => <D />); // 仅当 props 改变时才重新执行

总结:React 渲染的三个核心原则

  1. 定向触发(Targeted):更新始于状态变更组件,影响范围止于其子树;
  2. 惰性生成(Lazy):虚拟 DOM 节点仅在 render 执行时按需创建,非全局快照;
  3. 增量更新(Incremental):diff 基于局部新旧节点对比,DOM 操作最小化。

理解这一点,有助于写出更高效的 React 应用:合理拆分组件、善用 memo、避免在 render 中创建匿名函数或对象——因为这些行为虽不触发全树重绘,却可能破坏子组件的浅比较优化,导致本可跳过的渲染被意外激活。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3880

2024.08.14

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

467

2023.08.14

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

324

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

213

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

34

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

111

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

77

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

17

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号