浅谈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 相关文章推荐
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
jquery获取table中的某行全部td的内容方法
Mar 08 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
Jun 07 Javascript
JavaScript中的anchor()方法使用详解
Jun 08 Javascript
jQuery中事件与动画的总结分享
May 24 Javascript
jQuery中使用animate自定义动画的方法
May 29 Javascript
有关jQuery中parent()和siblings()的小问题
Jun 01 Javascript
JavaScript每天必学之事件
Sep 18 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
Jan 13 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
Jan 24 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
May 21 Javascript
一看就会的vuex实现登录验证(附案例)
Jan 09 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
中国收音机工业发展史
2021/03/02 无线电
PHP迭代器的内部执行过程详解
2013/11/12 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
利用js对象弹出一个层
2008/03/26 Javascript
Javascript调用C#代码
2011/01/17 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
JavaScript 中的 this 简单规则
2017/09/19 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
Python 2.7中文显示与处理方法
2018/07/16 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
电大学习个人自我评价范文
2013/10/04 职场文书
商务日语毕业生自荐信范文
2013/11/14 职场文书
产品设计开发计划书
2014/05/07 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
教师工作决心书
2015/02/04 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
修辞手法有哪些?
2019/08/29 职场文书