浅谈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.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
Nov 16 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
Aug 23 Javascript
js为数字添加逗号并格式化数字的代码
Aug 23 Javascript
js函数定时器实现定时读取系统实时连接数
Apr 30 Javascript
用javascript将数据导入Excel示例代码
Sep 10 Javascript
利用Jquery队列实现根据输入数量显示的动画
Sep 01 Javascript
easyui-datagrid特殊字符不能显示的处理方法
Apr 12 Javascript
浅谈node模块与npm包管理工具
Jan 03 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
May 13 Javascript
Vue中的vue-resource示例详解
Nov 02 Javascript
qrcode生成二维码微信长按无法识别问题的解决
Apr 04 Javascript
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
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的五种设计模式
2012/09/05 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
PHP7 新增常量
2021/03/09 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
删除节点的jquery代码
2014/01/13 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
详解JavaScript正则表达式之RegExp对象
2015/12/13 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
2019/04/08 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
深入Python函数编程的一些特性
2015/04/13 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
python实现转圈打印矩阵
2019/03/02 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
师范生实习个人的自我评价
2013/09/28 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
教师年终个人总结
2015/02/11 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server