浅谈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 String 的扩展方法集合
Jun 01 Javascript
ExtJS自定义主题(theme)样式详解
Nov 18 Javascript
JavaScript阻止事件冒泡示例分享
Dec 28 Javascript
jQuery.deferred对象使用详解
Mar 18 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
vue router 配置路由的方法
Jul 26 Javascript
JS构造一个html文本内容成文件流形式发送到后台
Jul 31 Javascript
Vue循环组件加validate多表单验证的实例
Sep 18 Javascript
关于layui toolbar和template的结合使用方法
Sep 19 Javascript
vue跳转方式(打开新页面)及传参操作示例
Jan 26 Javascript
electron踩坑之dialog中的callback解决
Oct 06 Javascript
Webpack5正式发布,有哪些新特性
Oct 12 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
初品cakephp 入门基础
2012/02/16 PHP
php简单实现MVC
2015/02/05 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
accesskey 提交
2006/06/26 Javascript
用js怎么把&amp;字符换成&quot;&amp;amp:&quot;
2006/10/19 Javascript
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
document.forms[].submit()使用介绍
2014/02/19 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
python中requests模块的使用方法
2015/04/08 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
户外亲子活动策划方案
2014/02/07 职场文书
教师节活动主持词
2014/04/02 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书