Vue中key的原理以及diff算法详解

 更新时间:2025年04月01日 14:26:02   作者:谦虚且进步  
这篇文章主要介绍了Vue中key的原理以及diff算法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Vue中key的原理以及diff算法

简介

Vue的key用于在虚拟DOM中标记节点,方便后面的diff对比算法进行对比,提升效率。

Vue的vm或者vc实例一共管理着3个DOM对象

分别他的模板对应的真实DOM、真实DOM的备份、以及重新生成的新的DOM,后两个可以看成是虚拟DOM,只要后面两个DOM的DOM树的叶子或者节点不一样(被指令操作虚拟DOM进行了修改),那么就会通过渲染函数render重新更新HTML页面上的真实DOM。

使用列表渲染时

会生成新的节点,这些节点不是一开始在模板当中写的,属于后来的DOM节点,所以需要特殊管理。

列表渲染新生成的DOM节点一般是一棵子DOM树

使用key可以记录这棵子树的根节点,diff差分算法就是根据从这个子树的根节点开始进行对比,判断DOM节点是否发生变化。

  • 如果发现key不存在,直接创建新的子树。
  • 如果key存在,则会对子树遍历。但是对于一些在HTML中的真实DOM中存在的内容,比如input框里面的内容,Vue是不知道的,因为Vue只有一开始真实DOM的备份,后面这个HTML页面上的真实DOM发生了什么变化Vue是不知道的。这就会导致真实DOM的一部分被替换掉,而另外一部分还是残留的老的真实DOM。

如果遍历容器时

使用index作为key,则会出现部分真实DOM残留的问题。实际开发中,一般使用独一无二的index作为key。

总结如下

  • 最好使用每条数据的唯一标识作为key,比如id、手机号、身份证号、学号等唯一值
  • 如果不存在对数组数据的逆序添加、逆序删除等破坏顺序的操作,仅用于渲染列表,使用index作为key是没有问题的

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue使用transition组件动画效果的实例代码

    vue使用transition组件动画效果的实例代码

    这篇文章主要介绍了vue使用transition组件动画效果的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 使用Vue3实现在浏览器端进行zip文件压缩

    使用Vue3实现在浏览器端进行zip文件压缩

    在前端开发中,我们时常需要处理文件上传和下载的功能,本文主要和大家分享一下如何使用Vue3和JSZip库在浏览器端实现zip文件压缩,需要的可以参考下
    2024-05-05
  • vue2.0 实现富文本编辑器功能

    vue2.0 实现富文本编辑器功能

    这篇文章主要介绍了vue2.0 实现富文本编辑器功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-05-05
  • vue项目如何删除无用的依赖详解

    vue项目如何删除无用的依赖详解

    vue是目前非常流行的前端开发框架,随着技术的不断更新,我们也需要更新我们的vue项目,这篇文章主要给大家介绍了关于vue项目如何删除无用的依赖的相关资料,需要的朋友可以参考下
    2024-09-09
  • 前端Vue中常用rules校验规则详解

    前端Vue中常用rules校验规则详解

    这篇文章主要介绍了前端Vue中常用rules校验规则详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 在Vue环境下利用worker运行interval计时器的步骤

    在Vue环境下利用worker运行interval计时器的步骤

    这篇文章主要介绍了在Vue环境下利用worker运行interval计时器的步骤,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 基于Vue3的打卡计时器实现方案

    基于Vue3的打卡计时器实现方案

    在日常工作和生活中,我们经常需要记录时间间隔,比如工作打卡、学习时长、项目耗时等,今天我将为大家介绍一个基于Vue3的打卡计时器实现方案,需要的朋友可以参考下
    2026-03-03
  • element修改form的el-input宽度,el-select宽度的方法实现

    element修改form的el-input宽度,el-select宽度的方法实现

    有时候像form表单这样,页面的input、select等宽度不一定会是一样的,可能有些长,有些短,本文就介绍了如何element修改form的el-input宽度,el-select宽度的方法实现,感兴趣的可以了解一下
    2022-02-02
  • Vue.js中v-bind指令的用法介绍

    Vue.js中v-bind指令的用法介绍

    这篇文章介绍了Vue.js中v-bind指令的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • vant中的toast轻提示实现代码

    vant中的toast轻提示实现代码

    这篇文章主要介绍了vant中的toast轻提示实现代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论