浅谈VUE中演示v-for为什么要加key


Posted in Javascript onJanuary 16, 2020

说到这个问题想必要举个例子了

没有key

<div id="app">
  <div>
   <input type="text" v-model="name">
   <button @click="add">添加</button>
  </div>
  <ul>
   <li v-for="(item, i) in list">
    <input type="checkbox"> {{item.name}}
   </li>
  </ul>
<script>
  // 创建 Vue 实例,得到 ViewModel
  var vm = new Vue({
   el: '#app',
   data: {
    name: '',
    newId: 3,
    list: [
     { id: 1, name: '李斯' },
     { id: 2, name: '吕不韦' },
     { id: 3, name: '嬴政' }
    ]
   },
   methods: {
    add() {
     //注意这里是unshift
     this.list.unshift({ id: ++this.newId, name: this.name })
     this.name = ''
    }
   }
  });
 </script>
 </div>

当选中吕不为时,添加楠楠后选中的确是李斯,并不是我们想要的结果,我们想要的是当添加楠楠后,一种选中的是吕不为

浅谈VUE中演示v-for为什么要加key

浅谈VUE中演示v-for为什么要加key

有key

<div id="app">
  <div>
   <input type="text" v-model="name">
   <button @click="add">添加</button>
  </div>
  <ul>
   <li v-for="(item, i) in list" :key="item.id">
    <input type="checkbox"> {{item.name}}
   </li>
  </ul>
<script>
  // 创建 Vue 实例,得到 ViewModel
  var vm = new Vue({
   el: '#app',
   data: {
    name: '',
    newId: 3,
    list: [
     { id: 1, name: '李斯' },
     { id: 2, name: '吕不韦' },
     { id: 3, name: '嬴政' }
    ]
   },
   methods: {
    add() {
     //注意这里是unshift
     this.list.unshift({ id: ++this.newId, name: this.name })
     this.name = ''
    }
   }
  });
 </script>
 </div>

同样当选中吕不为时,添加楠楠后依旧选中的是吕不为。

浅谈VUE中演示v-for为什么要加key

浅谈VUE中演示v-for为什么要加key

可以简单的这样理解:加了key(一定要具有唯一性) id的checkbox跟内容进行了一个关联。是我们想达到的效果

查过相关文档,图例说明很清晰。

vue和react的虚拟DOM的Diff算法大致相同,其核心是基于两个简单的假设
首先讲一下diff算法的处理方法,对操作前后的dom树同一层的节点进行对比,一层一层对比,如下图:

浅谈VUE中演示v-for为什么要加key

当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程默认情况下也是遵循以上原则。

比如一下这个情况:

浅谈VUE中演示v-for为什么要加key

我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

浅谈VUE中演示v-for为什么要加key

即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?
所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

浅谈VUE中演示v-for为什么要加key

vue中列表循环需加:key="唯一标识" 唯一标识可以是item里面id index等,因为vue组件高度复用增加Key可以标识组件的唯一性,为了更好地区别各个组件 key的作用主要是为了高效的更新虚拟DOM

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery之Document元素选择器篇
Aug 14 Javascript
JavaScript事件处理器中的event参数使用介绍
May 24 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
Oct 24 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
Feb 25 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
May 03 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
AngularJS基础 ng-list 指令详解及示例代码
Aug 02 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
Aug 05 Javascript
angular中实现控制器之间传递参数的方式
Apr 24 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
Jul 15 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
Aug 17 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
Vue引入Stylus知识点总结
Jan 16 #Javascript
js实现提交前对列表数据的增删改查
Jan 16 #Javascript
react实现移动端下拉菜单的示例代码
Jan 16 #Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
Jan 16 #Javascript
JS实现简单的表格增删
Jan 16 #Javascript
JS实现基本的网页计算器功能示例
Jan 16 #Javascript
JS数组进阶示例【数组的几种函数用法】
Jan 16 #Javascript
You might like
php 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
Python类的专用方法实例分析
2015/01/09 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
python 编码规范整理
2018/05/05 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
超市店庆活动方案
2014/08/31 职场文书
校车安全管理责任书
2015/05/11 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
导游词之岳阳楼
2019/09/25 职场文书
MySQL锁机制
2021/04/05 MySQL
图文详解nginx日志切割的实现
2022/01/18 Servers
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
python在package下继续嵌套一个package
2022/04/14 Python
Python使用openpyxl模块处理Excel文件
2022/06/05 Python