iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue中为什么不推荐用index做key详解
  • 718
分享到

Vue中为什么不推荐用index做key详解

2024-04-02 19:04:59 718人浏览 独家记忆
摘要

目录前言diff算法key的作用通过 key 管理状态效率 & Bug总结前言 尤大在Vue 2.x的文档中明确指出:建议尽可能在使用 v-for 时提供

前言

尤大在Vue 2.x的文档中明确指出:建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

尤大的建议说白了就是说:

如果index可以做key,那直接底层帮你传进去好了,又何必让你们多此一举呢?乖乖的不要用index做key

那么:key 到底有什么用? 当 vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用就地复用策略 。 这句话是什么意思?

让我们一起去探讨吧

diff算法

简单的说就是新旧虚拟dom的比较,如果有差异就以新的为准,然后再插入的真实的dom中,重新渲染

key的作用

一句话: key的作用主要是为了更高效的对比虚拟DOM中每个节点是否是相同节点;

举个简单的例子

三胞胎战成一排,你怎么知道谁是老大?

如果老大皮了一下子,和老三换了一下位置,你又如何区分出来?

给他们挂个牌牌,写上老大、老二、老三。

这样就不会认错了。key就是这个作用。

通过 key 管理状态

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

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

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

在没有 key 的情况下,Vue 将使用一种最小化元素移动的算法,并尽可能地就地更新/复用相同类型的元素。如果传了 key,则将根据 key 的变化顺序来重新排列元素,并且将始终移除/销毁 key 已经不存在的元素。

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

效率 & Bug

说到这,有些人就是认为是简单的效率问题。

确实:设置key可以让diff更高效,但仅仅是重绘重排吗?

答案是否定的

如果仅仅是效率低下,在操作极少的元素中,也无伤大雅。

但是,使用index带来的问题却要麻烦的多

<div id="app">
    <Child v-for="item,i in array" :text="item" @delete="remove(i)"/>
</div>

data() {
    return {
      array: [1, 2, 3]
    };
},
methods: {
    remove(i) {
      this.array.splice(i, 1);
    }
}
此时,key的作用就是为了复用。正是因为会复用,所以用index来做key会出现复用错误的问题, 造成意想不到的bug

总结

最简单方便的就是:使用数据库中的 id

如果返回值中没有id怎么办

  • 创建一个自增id函数,每次调用自增一
  • 使用uuid库

到此这篇关于Vue中为什么不推荐用index做key的文章就介绍到这了,更多相关Vue不推荐用index做key内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue中为什么不推荐用index做key详解

本文链接: https://www.lsjlt.com/news/167026.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue中为什么不推荐用index做key详解
    目录前言diff算法key的作用通过 key 管理状态效率 & Bug总结前言 尤大在vue 2.x的文档中明确指出:建议尽可能在使用 v-for 时提供...
    99+
    2024-04-02
  • Vue 中为什么不推荐用index 做 key属性值
    目录前言key 的作用key 在 diff 算法中的角色同步头部节点同步尾部节点添加新的节点删除多余节点最长递增子序列为什么不要用 index性能消耗数据错位解决方案总结前言 前端开...
    99+
    2024-04-02
  • react为什么不推荐使用index作为key
    1.旧的虚拟dom和新的虚拟dom对比,首先看他们的key是否相同 2.相同继续对比他们的内容,不同生成新的真实dom进行替换 3.如果内容和key都相同,复用旧的真实dom 不做改...
    99+
    2024-04-02
  • Vue中不推荐用index做key的原因有哪些
    这篇文章主要介绍了Vue中不推荐用index做key的原因有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前端开发中,只要涉及到列表渲染,那么无论是 React 还是 V...
    99+
    2023-06-21
  • 在vue中为什么不能用index作为key
    目录一、key的作用是什么?二、什么是虚拟DOM?三、什么是diff算法四、为什么不能用index作为key?(1)index不能作为key--情景一(2)index不能作为key-...
    99+
    2024-04-02
  • Spring为什么不推荐使用@Autowired注解详析
    目录引言 Spring的三种注入方式 属性(filed)注入 构造器注入 set方法注入 属性注入可能出现的问题 问题一 问题二 问题三 spring建议使用@Resource代替@...
    99+
    2024-04-02
  • 为什么不推荐使用C++
    这篇文章主要讲解了“为什么不推荐使用C++”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么不推荐使用C++”吧!(1) C++语法很复杂,好的C++程序员难求。语法上 C++14 开始的...
    99+
    2023-06-16
  • 为什么java不推荐使用vector
    从网上各处搜集的知识整理出来1.因为vector是线程安全的,所以效率低,这容易理解,类似StringBuffer2.Vector空间满了之后,扩容是一倍,而ArrayList仅仅是一半3.Vector分配内存的时候需要连续的存储空间,如果...
    99+
    2023-06-03
  • 为什么Spring和IDEA都不推荐使用@Autowired注解
    目录前言Spring为什么不推荐使用@Autowired 注解背景原因解决思考@Autowired, @Qualifier, @Resource, 三者有何区别参考文档前言 请看下面...
    99+
    2024-04-02
  • Spring和IDEA为什么都不推荐使用@Autowired注解
    今天小编给大家分享一下Spring和IDEA为什么都不推荐使用@Autowired注解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • 解析Idea为什么不推荐使用@Autowired进行Field注入
    目录Spring常见的DI方式@Autowired VS @Resource各种DI方式的优缺点Field注入的缺点为什么IDEA只对@Autowired警告大家在使用IDEA开发的...
    99+
    2024-04-02
  • vue为什么不用中文
    Vue为什么选择不使用中文?Vue是一种流行的JavaScript框架,用于构建动态用户界面。相比于其他框架,Vue更为简单、直观、高效。然而,尽管该框架在全球范围内广受欢迎,却选择不使用中文。那么,Vue为什么不用中文呢?首先,需要明确的...
    99+
    2023-05-14
  • 一文详解Vue中加上key后发生什么
    目录前言什么是Keykey的作用key的底层原理前言 最近接手了一个Vue项目,很多的代码片段使用到了key, 结合自己以前接触key的经历,于是思考,在Vue中加上key发生了什么...
    99+
    2023-05-16
    Vue key
  • 详解Golang Map中的key为什么是无序的
    目录一、为什么是无序的?二、GO 为什么要这么做?三、遍历是否真的无序的1.第一次遍历2.第二次遍历四、如何才能得到有序的键值对总结一、为什么是无序的? 开门见山,先上源码 func...
    99+
    2024-04-02
  • 详解Python为什么不用设计模式
    前言 刚刚看了EuroPython 2017一篇演讲,Why You Don't Need Design Patterns in Python,为什么python不用设计模式。演讲者...
    99+
    2024-04-02
  • 为什么vue中不建议使用空字符串作为className
    目录比较空字符串''和null情况1:使用空字符串''情况2:使用null情况3:使用undefined使用对象的形式绑定class使用 &&绑定class案例1:i...
    99+
    2024-04-02
  • vue中v-if和v-for为什么不能一起使用
    这篇文章主要介绍了vue中v-if和v-for为什么不能一起使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。v-if和v-for 不能同用...
    99+
    2024-04-02
  • 详解为什么PHP中要使用转义符
    随着 Web 技术的发展,脚本语言 PHP 在网站开发中应用愈加广泛。但是,在使用 PHP 编写代码时,我们常常需要用到转义符来处理字符串中特殊字符的情况。那么,为什么要在 PHP 中使用转义符呢?下面,我们来详细解释一下。一、概念解释在 ...
    99+
    2023-05-14
    php
  • 详解为什么说Golang中的字符串类型不能修改
    目录字符串定义字符串的组成字符串不能修改字符串的赋值为什么这么设计在接触Go这么语言,可能你经常会听到这样一句话。对于字符串不能修改,可能你很纳闷,日常开发中我们对字符串进行修改也是...
    99+
    2023-03-06
    Golang字符串类型不能修改 Golang字符串类型 Golang字符串
  • Java开发中为什么要使用单例模式详解
    目录一、什么是单例模式?二、实战案例一:处理资源访问冲突三、实战案例二:表示全局唯一类一、什么是单例模式? 单例设计模式(Singleton Design Pattern)理解起来非...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作