React 的 diff 策略是啥?

先说结论,不同标签,推倒重建,相同标签,修改属性

具体看下面的 demo。

1、 不同标签,删除 div 节点,新建 span 节点。

html 复制代码
<!-- 更新前 -->
<div>jingdong</div>

<!-- 更新后 -->
<span>jingdong</span>

2、相同标签,把 className 修改为 cls2

html 复制代码
<!-- 更新前 -->
<div className="cls1">jingdong</div>

<!-- 更新后 -->
<div className="cls2">jingdong</div>

3、直接新增 huawei 节点即可。

html 复制代码
<!-- 更新前 -->
<ul>
    <li>jingdong</li>
    <li>tengxun</li>
</ul>

<!-- 更新后 -->
<ul>
    <li>jingdong</li>
    <li>tengxun</li>
    <li>huawei</li>
</ul>

4、key 不同,即使相同标签,也推倒重建。

优先比较 key

html 复制代码
<!-- 更新前 -->
<div key="jd">jingdong</div>

<!-- 更新后 -->
<div key="jingdong">jingdong</div>

5、两次修改,一次新增

注意:没有 key 属性,对比下一个 demo。

html 复制代码
<!-- 更新前 -->
<ul>
    <li>jingdong</li>
    <li>tengxun</li>
</ul>

<!-- 更新后 -->
<ul>
    <li>huawei</li>
    <li>jingdong</li>
    <li>tengxun</li>
</ul>
  • jingdong 节点修改为 huawei 节点
  • tengxun 节点修改为 jingdong 节点
  • 新增 tengxun 节点

6、两次移动(性能更好),一次新增

注意:有 key 了。

html 复制代码
<!-- 更新前 -->
<ul>
    <li key="jd">jingdong</li>
    <li key="tx">tengxun</li>
</ul>

<!-- 更新后 -->
<ul>
    <li key="hw">huawei</li>
    <li key="jd">jingdong</li>
    <li key="tx">tengxun</li>
</ul>
  • 新增 huawei 节点
  • 移动 jingdong 节点到第二位
  • 移动 tengxun 节点到第三位

遇知如何移动,请看下回。

相关推荐
zzzzzz3101 小时前
react-bits:酷炫组件之外,React 页面表现力真正该怎么借力?
react.js·开源·动效
风月说与山鬼10 小时前
三、大括号语法
前端·react.js
Zkaisen1 天前
mtreoCVE-2025-11953学习(目录遍历与远程命令执行)
学习·react native·react.js·metro
zzzzzz3101 天前
react-bits 为什么会吸引前端开发者:别把动效当装饰,先把它当成页面能力
前端·react.js·动效
风月说与山鬼1 天前
二、React入口文件(main.jsx)
前端·react.js
张元清2 天前
React useTimeout Hook:声明式 setTimeout 与自动清理 (2026)
javascript·react.js
嘟嘟07172 天前
JWT 登录认证完整流程(React + Vite 实战复习)
react.js·vite
meilindehuzi_a2 天前
React JWT 登录鉴权实战:从无状态 HTTP 到路由守卫、Zustand 与 Axios 拦截器
前端·react.js·http
张元清3 天前
React useEventListener Hook:类型安全的 DOM 事件监听 (2026)
javascript·react.js
l1m0_3 天前
React+Tailwind+AI 实战:连锁餐饮管理后台从零到一开发复盘
前端·react.js·ui·ai·ai设计