v-for与key

  • 写在前面
  • 例子
    • 在最后一条数据后再加一条数据
    • 在中间插入一条数据
    • 数据变化如下
  • 虚拟DOM的Diff算法
  • 总而言之

写在前面

使用v-for更新已渲染的元素列表时,默认用就地复用策略;列表数据修改的时候,它会根据key值去判断某个值是否修改,如果修改,则重新渲染这一项,否则复用之前的元素;
我们在使用的时候经常会用index来作为key,但其实这不是一个好习惯,面试这样说直接挂,讲真。

例子

const list = [{id: 1,name: 'test1',},{id: 2,name: 'test2',},{id: 3,name: 'test3',},
]
上面这种是我们做项目中常用到的一种场景,因为不加key,vue现在直接报错,所以我使用index作为key;下面列举两种常见的数据更新情况:

在最后一条数据后再加一条数据

const list = [{id: 1,name: 'test1',},{id: 2,name: 'test2',},{id: 3,name: 'test3',},{id: 4,name: '我是在最后添加的一条数据',},
]
此时前三条数据直接复用之前的,新渲染最后一条数据,此时用index作为key,没有任何问题;

在中间插入一条数据

const list = [{id: 1,name: 'test1',},{id: 4,name: '我是插队的那条数据',}{id: 2,name: 'test2',},{id: 3,name: 'test3',},
]

数据变化如下


key: 0  index: 0 name: test1     key: 0  index: 0 name: test1
key: 1  index: 1 name: test2     key: 1  index: 1 name: 我是插队的那条数据
key: 2  index: 2 name: test3     key: 2  index: 2 name: test2key: 3  index: 3 name: test3

通过对比,发现除了第一个数据可以复用之前的之外,另外三条数据都需要重新渲染

最好的办法是使用数组中不会变化的那一项作为key值,对应到项目中,即每条数据都有一个唯一的id,来标识这条数据的唯一性;使用id作为key值,我们再来对比一下向中间插入一条数据,此时会怎么去渲染

虚拟DOM的Diff算法

vue和react的虚拟DOM的Diff算法大致相同,其核心是基于两个简单的假设:

两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构。
同一层级的一组节点,他们可以通过唯一的id进行区分。基于以上这两点假设,使得虚拟DOM的Diff算法的复杂度从O(n^3)降到了O(n)。

所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

总而言之

key的作用主要是为了高效地更新虚拟DOM。另外vue中在使用相同标签名元素地过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

v-for 一定要绑定key值吗?为什么不建议使用index?相关推荐

  1. Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究

    Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究 在github上阅览README.md以获得最佳阅读体验,点这里 v-for响应式key ...

  2. RadGrid使用技巧:从RadGrid获取绑定的值

    本文主要介绍从RadGrid获取绑定的值,仅适用于Telerik RadControls for asp.net ajax. 获取方式 RadGrid把绑定的值存储在VIewState中,即使View ...

  3. python字典相同key的值怎么分别取出_python字典值排序并取出前n个key值的方法

    python字典值排序并取出前n个key值的方法 今天在写一个算法的过程中,得到了一个类似下面的字典: {'user1':0.456,'user2':0.999,'user3':0.789,user: ...

  4. python 下划线转驼峰_json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: 原json串: String json= "{'user_name':'ok','user_sex':0,'object_info ...

  5. json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: public class JsonUtils {public final static void convert(Object json) ...

  6. Winform开发之ComboBox和ComboBoxEdit控件绑定key/value数据

    使用 ComboBox 控件绑定key/value值: 因为 ComboBox 是有 DataSource 属性的,所以它可以直接绑定数据源,如 DataTable.ListItem 等. 使用 Da ...

  7. java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串...

    java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 1 package com.zdz.test; ...

  8. vue注重细节的优化(绑定key)

    注重细节的优化 绑定key: key是给美一个vnode的为一id,可以依靠key,准确(更快)拿到oldVnode中对应的vnode节点 开发中偶尔会遇到需要生成唯一id的时候,比如对数组的任意一项 ...

  9. react循环key值_React性能优化的几个知识点

    各位同学大家晚上好,今天来说说react相关的东西.<从零玩转React全家桶核心(21)>正在更新,视频版请登录官网(www.it666.com)查看,或者扫码直达: Diff算法 开发 ...

最新文章

  1. Python统计在一个队列中有多少个正数,多少个负数
  2. 【机器学习PAI实践六】金融贷款发放预测
  3. 【C】——常用C时间库函数
  4. 8086汇编-实验3-编程、编译、链接、跟踪
  5. lua urlencode urldecode URL编码
  6. IIS6.0文件解析漏洞原理/复现
  7. nginx部署vue前端,刷新出现404或者500错误的解决方案
  8. 【证明】【一题多解】布尔不等式(union bound)的证明
  9. 经验10年搞不过卖烧烤的!后入阿里我软件测试是怎么学废的,这些话我想送给一事无成的自学测试们...
  10. python绘制小提琴图_Python:matplotlib 和 Seaborn 之热图、小提琴图和箱线图 (三十四)...
  11. android 圆形渐变背景,android实现圆形渐变进度条
  12. python中,获取设备网卡接口(ethx, mgmt)
  13. Emgucv不完整图像分割试验(十八)——Emgucv或opencv连接海康/萤石网络4G摄像头
  14. spark和tez的区别
  15. 批量清空数码照片中的相机设备型号、镜头型号、相机快门次数等拍摄数据
  16. 信息系统项目管理师案例分析万金油
  17. 大家在人生低谷时有多惨,怎么熬过来的(二)
  18. Hive中各种日期格式转换方法总结
  19. Unity3D之Windows端隐藏任务栏图标并添加至托盘
  20. Pandas个人最强笔记

热门文章

  1. python发邮件模板
  2. 【react】解决在外部设置react组件input的value问题
  3. SEO分享:网站站内优化TDK的写法
  4. oracle开机启动监听,如何让oracle DB、监听和oem开机启动(dbstart)
  5. 单分类算法:One Class SVM
  6. CSkin界面库案例分享
  7. 基于稀疏主成分分析的股票研究
  8. 网络架构采用 bs/cs 混搭模式_【案例赏析】60㎡混搭,鲜活的色彩混搭,元气满满...
  9. grunt 入门教程五:完整示例(完结篇)
  10. 软考程序员:复习笔记(三)