深入剖析Vue中v-for的使用及index作为key的弊端

简介: 深入剖析Vue中v-for的使用及index作为key的弊端

列表渲染v-for

我们可以使用 v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法,其中 items 是源数据的数组,而 item 是迭代项的别名,v-for 也支持使用可选的第二个参数表示当前项的位置索引。


data() {
  return {
    items: [{ message: 'Foo' }, { message: 'Bar' }]
  }
}
1、使用v-for遍历数组
<li v-for="(item, index) in items">
  {{ item.message }} - {{ index }}
</li>
2、你可以在定义 v-for 的变量别名时使用解构,和解构函数参数类似:
<li v-for="({ message }, index) in items">
  {{ message }} {{ index }}
</li>
3、你也可以使用 of 作为分隔符来替代 in,这更接近 JavaScript 的迭代器语法:
<li v-for="({ message }, index) of items">
  {{ message }} {{ index }}
</li>
4、你也可以使用 v-for 来遍历一个对象的所有属性
data() {
  return {
    myObject: {
      title: 'How to do lists in Vue',
      author: 'Jane Doe',
      publishedAt: '2016-04-10'
    }
  }
}

遍历的顺序会基于对该对象调用 Object.keys() 的返回值来决定。

第二个参数表示属性名 (例如 key):

第三个参数表示位置索引:

<li v-for="(value, key, index) in myObject">
  {{ index }}. {{ key }}: {{ value }}
</li>
5、v-for 可以直接接受一个整数值。在这种用例中,会将该模板基于 1…n 的取值范围重复多次。
<div v-for="n in 10">
    {{ n }}
</div>
6、v-if和v-for的优先级

同时使用 v-if 和 v-for 是不推荐的,因为这样二者的优先级不明显。

在vue2中,v-for的优先级高于v-if

在vue3中,v-if的优先级高于v-for

在外新包装一层 再在其上使用 v-for 可以解决这个问题 (这也更加明显易读):

<template v-for="todo in todos">
  <li v-if="!todo.isComplete">
    {{ todo.name }}
  </li>
</template>
7、通过 key 管理状态

Vue 默认按照“就地更新”的策略来更新通过 v-for 渲染的元素列表。当数据项的顺序改变时,Vue 不会随之移动 DOM 元素的顺序,而是就地更新每个元素,确保它们在原本指定的索引位置上渲染。

为了给 Vue 一个提示,以便它可以跟踪每个节点的标识,从而重用和重新排序现有的元素,你需要为每个元素对应的块提供一个唯一的 key。

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

key 这个特殊的属性主要作为 Vue 的虚拟 DOM 算法提示,在比较新旧节点列表时用于识别 vnode。key 绑定的值期望是一个基础类型的值,例如字符串或 number 类型。不要用对象作为 v-for 的 key。

8、 index 作为 key 是不推荐使用的
  • 性能问题:在 Vue中,使用索引作为 key 会导致 Vue 在跟踪每个项目的身份和数据变化时产生较大的性能开销。因为当列表项发生变化时,Vue 需要重新创建和渲染整个列表,而不是只更新单个元素。
  • 数据一致性问题:如果使用索引作为 key,当数据项发生移动时(例如排序或过滤操作),索引也会发生改变。这可能会导致数据和视图不一致,因为 Vue 无法跟踪这些变化。
  • 影响 Vue 的 diff 算法:Vue 的 diff 算法基于 key 进行。如果使用索引作为 key,当列表发生变化时,Vue 将无法正确地确定哪些元素发生了变化,哪些没有。这可能会导致不必要的渲染和性能问题。


为了避免这些问题,建议为每个列表项分配一个唯一的、不可变的 key 值。可以是每个项目的唯一标识符(例如数据库 ID),或者是一种可以唯一标识项目的方法(例如将项目添加到一个由字符串组成的字典中,将项目作为字典的键)。


同一个父元素下的子元素必须具有唯一的 key。重复的 key 将会导致渲染异常。


目录
相关文章
|
6天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
8天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1563 10
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
11天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
738 27
|
8天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
225 3
|
15天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
787 5
|
2天前
|
Python
【10月更文挑战第10天】「Mac上学Python 19」小学奥数篇5 - 圆和矩形的面积计算
本篇将通过 Python 和 Cangjie 双语解决简单的几何问题:计算圆的面积和矩形的面积。通过这道题,学生将掌握如何使用公式解决几何问题,并学会用编程实现数学公式。
108 60
|
1天前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
115 1
|
3天前
|
Java 开发者
【编程进阶知识】《Java 文件复制魔法:FileReader/FileWriter 的奇妙之旅》
本文深入探讨了如何使用 Java 中的 FileReader 和 FileWriter 进行文件复制操作,包括按字符和字符数组复制。通过详细讲解、代码示例和流程图,帮助读者掌握这一重要技能,提升 Java 编程能力。适合初学者和进阶开发者阅读。
104 61
|
14天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】