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 节点到第三位

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

相关推荐
不好听61335 分钟前
React 父子组件通信:从 Todo 应用理解单向数据流
前端·react.js
光影少年39 分钟前
RN 路由栈管理、页面销毁、返回拦截
javascript·react native·react.js
小林ixn10 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js
qetfw13 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
鱼毓屿御15 小时前
从「只会聊」到「边想边做」的跃迁
前端·学习·react.js
嘟嘟071716 小时前
搞懂 useState 从原生 DOM 到 React 惰性初始化的完整链路
前端·react.js·编程语言
先吃饱再说19 小时前
React 组件设计:从 Props 传递到组件封装
前端·react.js
小月土星21 小时前
React 状态管理核心原理:从批量 DOM 到派生状态
react.js
烬羽1 天前
AI 写代码总翻车?试试"先画图再砌墙"的 Vibe Coding 三步法
react.js·ai编程·vibecoding
光影少年1 天前
react navite 页面跳转、传参、路由监听、导航栏自定义
前端·react native·react.js