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

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

相关推荐
杨进军2 小时前
React 实现节点删除
前端·react.js·前端框架
爱编程的喵2 小时前
React useContext 深度解析:告别组件间通信的噩梦
前端·react.js
赫本的猫4 小时前
告别生命周期!用Hooks实现更优雅的React开发
前端·react.js·面试
赫本的猫4 小时前
React中的路由艺术:用react-router-dom实现无缝页面切换
前端·react.js·面试
光影少年4 小时前
React 组件中怎么做事件代理?它的原理是什么?
前端·react.js·掘金·金石计划
燃烧的土豆4 小时前
React 18 全局错误捕获 + React-router 6 动态权限路由
javascript·react.js·webpack
杨进军4 小时前
React 实现 useReducer
前端·react.js·前端框架
徐小夕4 小时前
开源了一款基于Nextjs实现的精美CRM系统, 卷王程序员狂喜!
前端·react.js·github
伍哥的传说13 小时前
React 自定义Hook——页面或元素滚动到底部监听 Hook
前端·react.js·前端框架