浅谈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 相关文章推荐
JavaScript初学者应注意的七个细节详细介绍
Dec 27 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
图片上传插件jquery.uploadify详解
Nov 15 Javascript
解析prototype,JQuery中跳出each循环的方法
Dec 12 Javascript
js判断ie版本号的简单实现代码
Mar 05 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
Oct 14 Javascript
基于jquery实现人物头像跟随鼠标转动
Aug 23 Javascript
Node.js创建Web、TCP服务器
Dec 05 Javascript
JS实现Cookie读、写、删除操作工具类示例
Aug 28 Javascript
详解vue配置后台接口方式
Mar 29 Javascript
extjs图形绘制之饼图实现方法分析
Mar 06 Javascript
JS高级程序设计之class继承重点详解
Jul 07 Javascript
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添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
PHP常用的小程序代码段
2015/11/14 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
jquery隔行换色效果实现方法
2015/01/15 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
[40:13]Ti4 冒泡赛第二天 iG vs NEWBEE 2
2014/07/15 DOTA
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
Python计算IV值的示例讲解
2020/02/28 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
详解python程序中的多任务
2020/09/16 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
学前教育学生自荐信范文
2013/12/31 职场文书
精彩自我鉴定
2014/01/16 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
学校四风对照检查材料
2014/08/28 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
学雷锋的心得体会
2014/09/04 职场文书
社区母亲节活动总结
2015/02/10 职场文书
联谊活动总结范文
2015/05/09 职场文书
小学见习报告
2015/06/23 职场文书
开学典礼致辞
2015/07/29 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书