浅谈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自定义的函数
Aug 05 Javascript
JS backgroundImage控制
May 19 Javascript
javascript 写类方式之八
Jul 05 Javascript
jQuery源码分析-01总体架构分析
Nov 14 Javascript
框架页面高度自动刷新的Javascript脚本
Nov 01 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
Oct 09 Javascript
js+css绘制颜色动态变化的圈中圈效果
Jan 27 Javascript
老生常谈jquery中detach()和remove()的区别
Mar 02 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
Apr 01 Javascript
Vue.js仿微信聊天窗口展示组件功能
Aug 11 Javascript
Vue组件之全局组件与局部组件的使用详解
Oct 09 Javascript
小程序实现左滑删除效果
Jul 25 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去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
jquery 学习之一 对象访问
2010/11/23 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
基于jQuery实现的单行公告活动轮播效果
2017/08/23 jQuery
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
javascript实现移动端上传图片功能
2020/08/18 Javascript
详解Python当中的字符串和编码
2015/04/25 Python
python开发之函数定义实例分析
2015/11/12 Python
Python实例一个类背后发生了什么
2016/02/09 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
linux下进程间通信的方式
2013/01/23 面试题
优秀教师演讲稿
2014/05/06 职场文书
锦旗标语大全
2014/06/23 职场文书
先进员工获奖感言
2014/08/14 职场文书
营销经理工作检讨书
2014/11/03 职场文书
小学生作文批改评语
2014/12/25 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
MySQL 数据类型详情
2021/11/11 MySQL