浅谈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 相关文章推荐
图片翻转效果具体实现代码
Jan 09 Javascript
限制上传文件大小和格式的jQuery插件实例
Jan 24 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
Feb 27 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 Javascript
使用jspdf生成pdf报表
Jul 03 Javascript
JQ技术实现注册页面带有校验密码强度
Jul 27 Javascript
JavaScript统计网站访问次数的实现代码
Nov 18 Javascript
AngularJS入门之动画
Jul 27 Javascript
浅析Javascript ES6中的原生Promise
Aug 25 Javascript
Angular中的interceptors拦截器
Jun 25 Javascript
vue-cli webpack 引入jquery的方法
Jan 10 jQuery
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
Oct 16 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 XML操作的各种方法解析(比较详细)
2010/06/17 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
Python中的作用域规则详解
2015/01/30 Python
简单解析Django框架中的表单验证
2015/07/17 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
python解包概念及实例
2021/02/17 Python
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
思想政治教育专业个人求职信范文
2013/12/20 职场文书
计算机学生求职信范文
2014/01/30 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
情人节活动策划方案
2014/02/27 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
Mysql数据库group by原理详解
2022/07/07 MySQL