浅谈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 相关文章推荐
浅析jQuery的链式调用之each函数
Dec 03 Javascript
jQuery中die()方法用法实例
Jan 19 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
每日十条JavaScript经验技巧(一)
Jun 23 Javascript
jQuery中的AjaxSubmit使用讲解
Sep 25 Javascript
纯JS焦点图特效实例(可一个页面多用)
Dec 07 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
Mar 15 Javascript
JS实现的加减乘除四则运算计算器示例
Aug 09 Javascript
使用vuex缓存数据并优化自己的vuex-cache
May 30 Javascript
Vue项目中Api的组织和返回数据处理的操作
Nov 04 Javascript
Element Input输入框的使用方法
Jul 26 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
Nov 17 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往windows中添加用户
2006/12/06 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
应届生骨科医生求职信
2013/10/31 职场文书
暑期社会实践感言
2014/02/25 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
房产协议书范本2014
2014/09/30 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
Oracle 死锁的检测查询及处理
2021/09/25 Oracle
教你nginx跳转配置的四种方式
2022/07/07 Servers