前端开发--快速了解Vue中的diff算法

2023-10-27

#博学谷IT学习技术支持#

目录

diff算法的概念

diff算法的三种比较方式

方式1: 根元素变了, 删除重建

方式2: 根元素没变, 属性改变, ==元素复用==, 更新属性

方式三: 根元素没变, 子元素没变, 元素内容改变

无key - 就地更新

有key, 值为索引

有key - 值为id

 总结

diff算法的概念

vue文件中的template里写的标签, 都是模板, 都要被vue处理成虚拟DOM对象, 才会渲染显示到真实DOM页面上

比如template里标签结构

<template>
    <div id="box">
        <p class="my_p">123</p>
    </div>
</template>

对应的虚拟DOM结构

const dom = {
    type: 'div',
    attributes: [{id: 'box'}],
    children: {
        type: 'p',
        attributes: [{class: 'my_p'}],
        text: '123'
    }
}

内存中生成一样的虚拟DOM结构(==本质是个JS对象==)

因为真实的DOM属性好几百个, 没办法快速的知道哪个属性改变了

利用diff算法, 找不不同, 只更新变化的部分(重绘/回流)到页面 - 也叫打补丁

生成新的虚拟DOM结构和旧的虚拟DOM结构对比

==好处1: 提高了更新DOM的性能(不用把页面全删除重新渲染)==

==好处2: 虚拟DOM只包含必要的属性(没有真实DOM上百个属性)==

虚拟DOM保存在内存中, 只记录dom关键信息, 配合diff算法提高DOM更新的性能

在内存中比较差异, 然后给真实DOM打补丁更新上

diff算法的三种比较方式

方式1: 根元素变了, 删除重建

旧虚拟DOM

<div id="box">
    <p class="my_p">123</p>
</div>

新虚拟DOM

<ul id="box">
    <li class="my_p">123</li>
</ul>

方式2: 根元素没变, 属性改变, ==元素复用==, 更新属性

旧虚拟DOM

<div id="box">
    <p class="my_p">123</p>
</div>

新虚拟DOM

<div id="myBox" title="标题">
    <p class="my_p">123</p>
</div>

方式三: 根元素没变, 子元素没变, 元素内容改变

无key - 就地更新

v-for不会移动DOM, 而是尝试复用, 就地更新,如果需要v-for移动DOM, 你需要用特殊 attribute key 来提供一个排序提示

<ul id="myUL">
    <li v-for="str in arr">
        {{ str }} 
        <input type="text">
    </li>
</ul>
<button @click="addFn">下标为1的位置新增一个</button>
export default {
    data(){
        return {
            arr: ["老大", "新来的", "老二", "老三"]
        }
    },
    methods: {
        addFn(){
            this.arr.splice(1, 0, '新来的')
        }
    }
};

旧 - 虚拟DOM结构 和 新 - 虚拟DOM结构 对比过程  

==性能不高, 从第二个li往后都更新了==  

有key, 值为索引

还是就地更新,因为新旧虚拟DOM对比, key存在就复用此标签更新内容, 如果不存在就直接建立一个新的

<ul id="myUL">
    <li v-for="(str, index) in arr" :key="index">
        {{ str }} 
        <input type="text">
    </li>
</ul>
<button @click="addFn">下标为1的位置新增一个</button>
export default {
    data(){
        return {
            arr: ["老大", "新来的", "老二", "老三"]
        }
    },
    methods: {
        addFn(){
            this.arr.splice(1, 0, '新来的')
        }
    }
};

 

  1. v-for先循环产生新的DOM结构, key是连续的, 和数据对应

  2. 然后比较新旧DOM结构, 找到区别, 打补丁到页面上

    最后补一个li, 然后从第二个往后, 都要更新内容

有key - 值为id

key的值只能是唯一不重复的, 字符串或数值

v-for不会移动DOM, 而是尝试复用, 就地更新,如果需要v-for移动DOM, 你需要用特殊 attribute key 来提供一个排序提示

新DOM里数据的key存在, 去旧的虚拟DOM结构里找到key标记的标签, 复用标签

新DOM里数据的key存在, 去旧的虚拟DOM结构里没有找到key标签的标签, 创建

旧DOM结构的key, 在新的DOM结构里没有了, 则==移除key所在的标签==

<template>
  <div>
    <ul>
      <li v-for="obj in arr" :key="obj.id">
        {{ obj.name }}
        <input type="text">
      </li>
    </ul>
    <button @click="btn">下标1位置插入新来的</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      arr: [
        {
          name: '老大',
          id: 50
        },
        {
          name: '老二',
          id: 31
        },
        {
          name: '老三',
          id: 10
        }
      ],
    };
  },
  methods: {
    btn(){
      this.arr.splice(1, 0, {
        id: 19, 
        name: '新来的'
      })
    }
  }
};
</script>

<style>
</style>

 不用key也不影响功能(就地更新), 添加key可以提高更新的性能

 总结

diff算法如何比较新旧虚拟DOM?

  • 根元素改变 – 删除当前DOM树重新建

  • 根元素未变, 属性改变 – 更新属性

  • 根元素未变, 子元素/内容改变

  • 无key – 就地更新 / 有key – 按key比较

key值要求是唯一不重复的字符串或者数值
key的值有id用id, 没id用索引

key的好处:可以配合虚拟DOM提高更新的性能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端开发--快速了解Vue中的diff算法 的相关文章

随机推荐

  • 跟hoowa学做智能路由(五):熟悉OpenWRT

    题记 呦呦鹿鸣 食野之苹 我有嘉宾 鼓瑟吹笙 从本章开始 我们要更多的了解系统的特性 以及不论是智能路由还是智能家居 我们用路由器的处理器到底能做多少事情 系统结构 在上一章我们已经完成了刷机工作 这个时候系统进行了首次启动 并且格式化了它
  • 基于“机器学习”的智能聊天机器人---python实现(1)

    本博文以自己课程设计为依托 介绍如何利用python语言编程实现基于 机器学习 的智能聊天机器人 由于本项目是自己首次接触python以及利用计算机编程实现小型项目 中途遇到诸多问题 自己也在其中收获很多 故想写一篇博文记录一下自己课程设计
  • H3C 查看设备路由表

    转载于 https www cnblogs com fanweisheng p 11156750 html
  • 毕业设计-基于深度学习的视觉多目标跟踪

    目录 前言 课题背景和意义 实现技术思路 一 基于深度学习的视觉多目标跟踪 二 基于深度学习的DBT算法 三 基于深度学习的JDT算法 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做
  • mysql快速导入sql文件_MySQL高效导入多个.sql文件方法详解

    MySQL有多种方法导入多个 sql文件 里面是sql语句 常用的有两个命令 mysql和source 但是这两个命令的导入效率差别很大 具体请看最后的比较 还有sqlimport和LOAD DATA INFILE等导入方法 不过它们主要用
  • FreeRTOS学习---“信号量”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 在 消息队列 篇中 我们曾经埋下一个伏笔 就是说 FreeRT
  • CMSIS-RTOS 信号量

    信号量Semaphores 和信号类似 信号量也是一种同步多个线程的方式 简单来讲 信号量就是装有一些令牌的容器 当一个线程在执行过程中 就可能遇到一个系统调用来获取信号量令牌 如果这个信号量包含多个令牌 线程就会继续执行 同时信号量令牌的
  • 使用 sklearn 进行数学建模的通用模板

    前言 无论是本科和研究生都会有的数学建模含金量还是很高的 下面将介绍一下进行数学建模的一些基本操作方法 这里主要是利用sklearn 进行建模 包括前期的一些数据预处理以及一些常用的机器学习模型以及一些简单粗暴的通用建模步骤 仅代表我自己意
  • 用背景渐变的透明度设置不同颜色的背景渐变

    项目最近这几天正在做不同主题的颜色配置方案 要根据用户输入的颜色来配置整个主题的颜色 让人头疼的是 其中一个主题所有的列表头部背景色都是2到3组渐变值的线性渐变 也就是说 要根据用户输入的颜色值生成不同的但相似度很近的渐变颜色 我上网查了些
  • mysql中explain用法和结果的含义

    explain select from user explain extended select from user id SELECT识别符 这是SELECT的查询序列号 select type SELECT类型 可以为以下任何一种 SI
  • 【ML】使DBSCAN 变得简单 & 如何使用 Scikit-Learn 进行 Python 教程

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • [架构之路-180]-《软考-系统分析师》-19- 系统可靠性分析与设计 -2- 容错最重要的技术手段:冗余技术

    目录 1 9 3 冗余技术 19 3 1冗余技术的分类 1 结构冗余 硬件冗余 2 信息冗余 数据冗余 3 时间冗余 4 冗余附加 19 3 2 冗余系统与其工作原理 1 9 3 冗余技术 提高系统可靠性的技术可以分为避错 排错 技术和容错
  • ev3 c语言高级编程,EV3运行原生C语言程序实例

    EV3运行原生C语言程序实例 本帖最后由 ntwuhui 于 2013 9 20 07 58 编辑 说明 以下过程直接在EV3系统上编译原生C语言程序 不需要修改固件 Ununtu13 04测试通过 个人觉得此法应该也可以在其他Linux系
  • Python subprocess模块

    Python subprocess模块 从Python 2 4开始 Python引入subprocess模块来管理子进程 以取代一些旧模块的方法 如 os system os spawn os popen popen2 commands 不
  • 高并发解决方案

    解决高并发方案 背景 在今天 基于SOA的架构已经大行其道 伴随着架构的SOA化 相关联的服务熔断 降级 限流等思想 也在各种技术讲座中频繁出现 本文将结合Netflix开源的Hystrix框架 对这些思想做一个梳理 伴随着业务复杂性的提高
  • 【react】生命周期(旧)

    生命周期的三个阶段 初始化阶段 由ReactDOM render 触发 初次渲染 constructor 构造器 componentWillMount 组件将要挂载 render 初始化渲染和状态更新之后调用 调1 n次 component
  • WPF控件

    这个月 学习了WPF的控件 还有窗口的一些属性 但更多的控件的内容 控件是门面 控件有很多 日常工作中打交道最多的控件无外乎6类 布局控件 内容控件 带标题内容控件等 条目控件 带标题条目控件 学习控件之前 需要先了解UI元素 UI的功能是
  • JWT简单介绍

    目录 JWT 概述 token认证和session认证的区别 传统的session认证 基于session认证所显露的问题 基于token的鉴权机制 JWT 的主要应用场景 优点 JWT搭建 基于java 创建生成token的方法 验证to
  • chrony详解

    关于chrony chrony is a versatile implementation of the Network Time Protocol NTP It can synchronize the system clock with
  • 前端开发--快速了解Vue中的diff算法

    博学谷IT学习技术支持 目录 diff算法的概念 diff算法的三种比较方式 方式1 根元素变了 删除重建 方式2 根元素没变 属性改变 元素复用 更新属性 方式三 根元素没变 子元素没变 元素内容改变 无key 就地更新 有key 值为索