浅谈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 相关文章推荐
js下写一个事件队列操作函数
Jul 19 Javascript
Webkit的跨域安全问题说明
Sep 13 Javascript
Jquery实现的tab效果可以指定默认显示第几页
Oct 16 Javascript
jquery sortable的拖动方法示例详解
Jan 16 Javascript
jQuery中index()方法用法实例
Dec 27 Javascript
jQuery实现返回顶部效果的方法
May 29 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
Mar 02 Javascript
初学者AngularJS的环境搭建过程
Oct 27 Javascript
React.Js添加与删除onScroll事件的方法详解
Nov 03 Javascript
layui清空,重置表单数据的实例
Sep 12 Javascript
Javascript Dom元素获取和添加详解
Sep 24 Javascript
node+multer实现图片上传的示例代码
Feb 18 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP基础之运算符的使用方法
2013/04/28 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
js实现点击按钮复制文本功能
2020/07/20 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
python中Flask框架简单入门实例
2015/03/21 Python
python从sqlite读取并显示数据的方法
2015/05/08 Python
python生成验证码图片代码分享
2016/01/28 Python
python利用正则表达式提取字符串
2016/12/08 Python
Python文件路径名的操作方法
2019/10/30 Python
Python如何使用正则表达式爬取京东商品信息
2020/06/01 Python
is_file和file_exists效率比较
2021/03/14 PHP
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
C语言笔试题回忆
2015/04/02 面试题
c语言常见笔试题总结
2016/09/05 面试题
运动会广播稿80字
2014/01/23 职场文书
《口技》教学反思
2014/02/21 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
工作感想范文
2015/08/07 职场文书
Vue通过懒加载提升页面响应速度
2021/05/10 Vue.js