浅谈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实现div拖拽宽度示例代码
Jul 31 Javascript
node.js中的fs.chownSync方法使用说明
Dec 16 Javascript
JQuery控制Radio选中方法分析
May 29 Javascript
深入理解JavaScript程序中内存泄漏
Mar 17 Javascript
JS 面向对象之继承---多种组合继承详解
Jul 10 Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 Javascript
用React实现一个完整的TodoList的示例代码
Oct 30 Javascript
基于jquery实现九宫格拼图小游戏
Nov 30 jQuery
Vue多组件仓库开发与发布详解
Feb 28 Javascript
webpack4.x下babel的安装、配置及使用详解
Mar 07 Javascript
微信小程序实现的一键连接wifi功能示例
Apr 24 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
Jul 19 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 类商品秒杀计时实现代码
2010/05/05 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
django输出html内容的实例
2018/05/27 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
python如何实现图片压缩
2020/09/11 Python
应届生法律求职信
2013/10/22 职场文书
自我评价格式
2014/01/06 职场文书
医生进修自我鉴定
2014/01/19 职场文书
高一政治教学反思
2014/01/28 职场文书
批评与自我批评范文
2014/10/15 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
职工宿舍管理制度
2015/08/05 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js