首页 > 其他分享 >vue,for循环为什么不提倡放主键id

vue,for循环为什么不提倡放主键id

时间:2024-11-08 14:32:34浏览次数:1  
标签:vue DOM 更新 id Vue key 主键

在 Vue.js 中,v-for 循环用于渲染列表时,推荐为每个列表项提供一个 key 属性,以帮助 Vue 更高效地更新和复用 DOM 元素。但是,使用主键 id 作为 key 有时并不推荐,原因如下:

1. id 不一定稳定

主键 id 通常是在数据库中生成的唯一标识符,虽然在数据库中它是唯一的,但在前端应用中,尤其是在动态更新或从后端加载数据时,id 的值有时可能会发生变化。

例如,如果你在前端更新某个数据项并重新请求数据,后端返回的 id 可能与之前不同(例如,数据重新生成或数据结构调整)。这种情况下,使用 id 作为 key 可能会导致 Vue 错误地认为是新的项,而不是更新现有项,从而引起不必要的 DOM 更新和性能问题。

2. key 用于标识和追踪组件的状态

Vue 使用 key 来标识每个 DOM 元素或组件的身份,帮助它追踪和复用 DOM 元素。当你改变数据时,Vue 会通过 key 来判断哪些元素应该更新、哪些应该重新渲染。主键 id 有时并不能保证与数据项的变化同步,尤其是在动态列表(如增删项目)中,可能会导致 Vue 错误地复用或重排 DOM 元素。

例如,如果你从后端获取的 id 数据发生了变化,Vue 可能会将一个原本应该重新渲染的元素视为“已存在”的项,导致渲染不正确。

3. key 应该是稳定且一致的

Vue 推荐使用 稳定且一致 的值作为 key,这样 Vue 就能更准确地跟踪每一个元素的状态。更合适的做法是:

  • 使用独立的唯一标识符:如果数据项有一个更稳定、不会频繁变化的标识符(例如 uuidslug 或其他自定义的唯一属性),可以使用它作为 key
  • 避免使用 id(如果它可能变化):如果数据的 id 是从后端动态生成的,且可能在后续更新中发生变化,那么不建议将其作为 key

4. 避免使用索引作为 key(除非数据不会变动)

另一个常见的做法是使用数组的索引作为 key。虽然这种方法在某些情况下是有效的,但它也有潜在的缺点。特别是在列表中有增删项时,使用索引作为 key 会导致 Vue 无法准确判断哪些元素需要更新,可能会引发性能问题或错乱的渲染。

5. 正确的做法示例

<!-- 使用稳定的唯一标识符(如 uuid)作为 key -->
<div v-for="item in items" :key="item.uuid">
  {{ item.name }}
</div>

这样,无论数据项如何增删、更新,Vue 都能准确地识别每一项,并高效地更新 DOM。

6. 总结

尽管主键 id 在很多数据库设计中是唯一且有效的标识符,但在 Vue 中,作为 v-for 循环的 key 时可能会遇到以下问题:

  • id 不稳定,可能会在动态数据更新时发生变化。
  • 使用 id 可能导致 Vue 错误地复用或重排 DOM 元素,造成性能问题。
  • key 应该是稳定且一致的,以便 Vue 更高效地进行 DOM 更新。

因此,建议为每个循环项使用更稳定且不会发生变化的唯一标识符作为 key,如 uuid 或自定义的唯一属性。

标签:vue,DOM,更新,id,Vue,key,主键
From: https://www.cnblogs.com/pansidong/p/18535006

相关文章

  • 三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它
    官方文档:https://fastapi.tiangolo.com/zh/advanced/wsgi/包含WSGI-Flask,Django,其它¶您可以挂载多个WSGI应用,正如您在 SubApplications-Mounts, BehindaProxy 中所看到的那样。为此,您可以使用 WSGIMiddleware 来包装你的WSGI应用,如:Flask,Django,等等。使......
  • Ubuntu安装Nvidia驱动与Cuda Toolkit详细教程 | 步骤解析与环境配置 - 幽络源
    步骤概述步骤1:检查是否安装Nvidia驱动步骤2:查询显卡匹配的驱动版本步骤3:安装Nvidia驱动步骤4:检查Nvidia是否安装并加载步骤5:禁用nouveau步骤6:重新加载nvidia驱动并检查步骤7:下载cudatoolkit步骤8:安装cudatoolkit到指定目录步骤9:配置cudatoolkit环境变量步骤10:测试cudatool......
  • RTT_t2 提示Expected to be given a valid DLL
    软件:RTT_t2 V2.60环境:WIN1064bit安装好RTT_t2后,运行软件出现以下错误:Traceback(mostrecentcalllast):File"rtt_t2.py",line1304,in<module>File"rtt_t2.py",line1041,inmainFile"bds\bds_jlink.py",line15,in__init__......
  • Vite与Vue Cli的区别与详解
    它们的功能非常相似,都是提供基本项目脚手架和开发服务器的构建工具。主要区别Vite在开发环境下基于浏览器原生ES6Modules提供功能支持,在生产环境下基于Rollup打包;VueCli不区分环境,都是基于Webpack。在生产环境下,两者都是基于源码文件的,Rollup和Webpack都是对代码进行......
  • python3.5-IDLE中斐波那契数列程序实现
    斐波那契数列F(n)定义:F(0)=0,F(1)=1,……,F(n)=F(n-2)+F(n-1),其中n≥2(简单总结,从第3个数起,斐波那契数列中每个数都是前两个数之和)代码实现:1)采用迭代方式实现:deffibonacci_iterative(n):ifn<=0:return0elifn==1:return1......
  • 【北京迅为】itop-3588开发板摄像头使用手册Android12 双摄方案
     本章节对应资料在网盘资料“iTOP-3588开发板\02_【iTOP-RK3588开发板】开发资料\07_Android系统开发配套资料\08_Android12摄像头使用配套资料”目录下下载。 2.1Android12前摄+后摄网盘中默认的Android12源码支持四个摄像头单独打开,本小节我们来修改源码,实现同......
  • Vuex的基本使用
    文章目录一、Vuex概述1.是什么2.使用场景3.优势4.注意二、如何构建vuex多组件共享数据环境1.创建项目2.创建三个组件3.源代码三、vuex的使用-创建仓库1.安装vuex2.新建`store/index.js`专门存放vuex3.创建仓库`store/index.js`4在main......
  • 第三十四章 Vue路由进阶之声明式导航(导航高亮)
    目录一、导航高亮1.1.基于语法1.2.主要代码 二、声明式导航的两个类名2.1.声明式导航类名匹配方式2.2.声明式导航类名样式自定义 ​2.3.核心代码一、导航高亮1.1.基于语法在Vue中通过VueRouter插件,我们可以非常简单的实现实现导航高亮效果VueRouter提......
  • 【前端】浅谈SOLID原则在前端的使用
    原创宁奇舞精选本文作者系360奇舞团前端开发工程师简介SOLID原则是由RobertC.Martin在2000年提出的一套软件开发准则,最初用于面向对象编程(OOP),旨在解决软件开发中的复杂性和维护问题。随着时间推移,它不仅在传统OOP语言中广泛应用,也被引入到JavaScript和TypeS......
  • H3C UniServer R5300 G3安装Ubuntu16.04系统下11T容量RAID5只识别为900G
    组网及说明装配组件:H3CUniServerR5300G3-RS5Z1R5300C-CTO服务器-国内版板卡:P460-M4阵列卡系统版本:Ubuntu16.04问题描述1、实际上sdb是4块4T盘配置的raid5,在系统下lsblk查看到只有900G大小。2、HDM中逻辑卷容量识别正常,SDS日志无报错。3、按照smartpqi的驱动升级步骤未......