我们现在在使用v-for的时候、都必须会加上一个必要的key值,并且很多人会使用index来作为key,其实这样是不太妥当的一种做法。那么v-for中的键值key到底有什么作用呢。请看:

官方给出的解答

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。这个类似 Vue 1.x 的 track-by="$index"。

这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key attribute:

<div v-for="item in items" v-bind:key="item.id">
<!-- 内容 -->
</div>

建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

举例

<div v-for="(item,index) in list" :key="index"> {{item.name}}</div>
list: [{id: 1,name: "name1",},{id: 2,name: "name2",},{id: 3,name: "name3",}
]

这个场景如何我们不佳key vue 回直接报错,所以大部分人都会使用index作为key的值

如果我们在添加一个数据


list: [{id: 1,name: "name1",},{id: 2,name: "name2",},{id: 3,name: "name3",},{id: 4,name: "last",},
]

此时前面3条数据直接服用之前的,新渲染最后一条数据,此时index作为key没有任何问题

如何我们在中间添加一条

list: [{id: 1,name: "name1",},{id: 2,name: "name2",}, {id: 4,name: "last",},{id: 3,name: "name3",}
]

此时我们更新渲染的数据 通过index 定义key 进行数据对比一下

之前的数据:

中间插入之后的数据 :

由此可以发现除了第一条数据可以复用以为其余的3条数据都是需要重新渲染,因为key的值发生了变化。

这个时候就可以体现出一个效率的问题,只插入一条数据,却要从新渲染3条数据

所以我们需要可以想办法让数组中不会变化的数据的key值也不变,所以不能通过index来设置key值,应该设置一个唯一的id来标识数据的唯一性;我们修改之后再来对比一下渲染的效率:

之前的数据:

<div v-for="(item,index) in list" :key="item.id"> {{item.name}}</div>

中间插入之后的数据:

对此对比发现,只有一条数据发生改变,因为其他数据的id 都没有变、所以对应的key也没有发生改变。我们只需要渲染这一条新的数据就可以。 所以一般推荐使用id作为key值配合v-for使用

总结:

Vue很大的一个特点就是双向数据绑定,数据一旦改变,那么页面就渲染新的数据呈现在页面上。但是对于用v-for渲染的列表数据来说,数据量可能一般很庞大,而且我们经常还要对这个数据进行一些增删改操作,而key的出现就是尽可能的回避这个问题,提高效率,如果我们给列表增加了一条数据,页面只渲染了这数据。

v-for的键值key相关推荐

  1. php 获取js对象的属性值,js获取对象,数组所有属性键值(key)和对应值(value)的方法示例...

    本文实例讲述了js获取对象,数组所有属性键值(key)和对应值(value)的方法.分享给大家供大家参考,具体如下: var values=function(object) { var values ...

  2. 通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  3. java的map键值类型是否固定_Java中Map根据键值(key)或者值(value)进行排序实现

    我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...

  4. JS设置二维数组键值key

    项目场景: 每一列对应是一条数据,并设置对应key值 解决方案: JS方案 let list = [["腾讯", "百度", "阿里巴巴", ...

  5. Memcache 键值key的格式和类型

    开发搜索功能的时候,需要搜索词分词并且标红.因为搜索词标红是一个费时的操作,所以对于搜素词的分词结果做了五分钟的缓存.并且以搜索词为key,开发完毕.某次搜索之后,发现了异常的log, 文本如下: j ...

  6. list python 访问 键值对_基础|Python常用知识点汇总(中)

    字符串字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串.1.创建字符串 str1 = 'Hello World!' str2 = "Hello W ...

  7. IPC 共享内存和 消息队列(发送、接收、移除)以及键值的生成

    一.消息对列 消息队列,是消息的链接表,存放在内核中.一个消息队列由一个标识符(即队列ID)来标识. 特点: 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级.消息队列独立于发送与接收进 ...

  8. 哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding

    哈希表添加 哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加 ...

  9. python获取字典键值集合_Python集合字典

    Python集合&字典 @ 字典 字典的几种定义方式 第一种 字典{key1 : value1, key2 : value2, ......} dict1 = {'one': 1, 'two' ...

最新文章

  1. 哪种编程语言最适合初学者?
  2. python中读取文件过程中seek()函数的使用
  3. java微妙_10个微妙的Java编码最佳实践
  4. Flask框架(flask中对cookie的处理(设置cookie、获取cookie、删除cookie))
  5. llvm编译器实战教程第二版_LLVM编译器实战教程
  6. jsp传递参数的四种方法
  7. 设计模式(六)------设计模式六大原则(5):迪米特法则
  8. 【写作技巧】毕业设计的附录放在论文的哪个位置?
  9. 总结:MySQL备份与恢复的三种方法
  10. IDM磁力解析 IDM磁力使用教程
  11. 计算机网络自顶向下方法 习题参考答案 第一章
  12. HAL库控制PS2手柄
  13. 十大著名黑客——George Hotz
  14. 基于Electron的桌面端应用开发和实践
  15. ug电子产品计算机建模,UG10网格曲面咖啡壶
  16. 《算法笔记》9.4小节 9.5小节——数据结构专题(2)->二叉查找树(BST)->平衡二叉树(AVL)
  17. 一款简洁的 image-crop.js图片裁剪工具
  18. 如何与VMware虚拟机共享文件
  19. 电路中极性与非极性电容并联的作用
  20. 网易云课堂Linux运维在线班英文单词笔记

热门文章

  1. 一点计算机电脑就闪,电脑屏幕闪,点一下闪一下
  2. 京东双11养红包升级脚本
  3. ssm校园故障保修系统 计算机专业毕设源码01151
  4. 在cmd下用cd命令进不了D盘的问题
  5. (译)菱形不是银弹,但范加尔、罗杰斯们是如何改造它的?
  6. IT宅男利用Python网络爬虫获取Mikan动漫资源(属于宅男的快乐)
  7. 【Android Gradle 插件】LintOptions 配置 ③ ( LintOptions#error 方法配置 | Lint 问题 ID | 查询 Lint 问题 ID 列表 )
  8. SpringBoot前后端分离参数传递方式总结
  9. Hook textout可能遇到的问题
  10. SSL漏洞及其利用工具(SSL会话劫持)