为什么不用 index 做 key 引出的 Diff 算法

news2024/11/16 7:37:03

文章目录

    • 问题
    • 分析

问题

大家耳熟能详的最常见的问题就是 为什么不用 index 做 key ,在刚开始学习的时候,只是知道在 v-for 做循环遍历的时候需要加上唯一标识 key,但好像都是这么写的 v-for="(item,index) in dictList" :key="index",至于为什么在这里用index又不太好了,突然脑子空白了,直到我在掘金上榜的一篇文章中看到了答案,接下来我结合他的想法和我的想法用大白话讲两句
在这里插入图片描述

分析

  1. 我们在做渲染遍历的时候,是可以用 index 作为key这样的一个唯一标识,但是当对代码有一定的理解后,是不建议用它的,那应该用什么呢?应该用遍历生成的每一项的唯一标识,例如 :key="item,id"或者其他可以唯一标识的字段名。那么,新问题来了,为什么???

  2. 举一个例子,现在有一个列表list,我们已经将它渲染在了我们页面上,现在呢,要修改list,比如将某个值给他换了个数据,这个时候我们知道DOM要被重新渲染的,也就是我们常说的列表发生变化,DOM树重新被渲染,那我们频繁改变呢,而这个列表生成的虚拟DOM树又很大的情况下怎么办,浪费资源,浪费性能,怎么办!!!

  3. 尤雨溪 想到办法了,Vue 将新生成的新虚拟 DOM 与上一次渲染时生成的旧虚拟 DOM 进行比较,对比出是哪个虚拟节点更改了,找出这个虚拟节点,并只更新这个虚拟节点所对应的真实节点,而不用更新其他数据没发生改变的节点。这样一来是不是就性能好很多了

  4. 这个呢就是 Diff 算法,这时候有人会问:那跟index作为key有什么关系。别着急,听我往下讲

  5. 运用这个 Diff 算法呢,我们节省了性能,节省了资源,那我绑定 indexitem.id有区别吗

  6. 当然有,我们再举个例子,循环遍历生成的一个数组,我们在头部添加一个元素,这个索引 index 是不是就要变,index 变了,是不是整个DOM就要重新渲染一遍,

  7. 而我们用item中的某个唯一标识去作为key时,Diff 算法就会进行遍历比较,发现其他节点并未变化,只是某个节点发生了变化,就不用去重新渲染其他DOM结构了,这也有点像 “有则改之无则加勉” 这句话。

  8. 那 Diff 算法是如何工作的呢

    • 新旧虚拟DOM对比的时候,Diff 算法比较只会在同层级进行,不会跨层级比较。
    • 首先比较两个节点的类型,如果类型不同,则废弃旧节点并用新节点替代。
    • 对于相同类型的节点,进一步比较它们的属性。记录属性差异,以便生成相应的补丁。
    • 如果两个节点相同,继续递归比较它们的子节点,直到遍历完整个树。
    • 如果节点有唯一标识,可以通过这些标识来快速定位相同标识的节点。
    • 如果节点的相同,只是顺序变化,不会执行不必要的操作。
  9. 以下是我总结的 不推荐使用索引作为key,使用索引作为key可能会引发一些问题

    • 更新性能问题:当列表中的项目发生变化时,如果使用索引作为key,Vue可能会错误地识别和处理这些变化,导致出现意外行为和性能问题。
    • 动态数据问题:如果列表中的项目可能会动态增加或减少,使用索引作为key可能导致Vue在更新时出现混乱,因为索引并不代表每个列表项的唯一身份。
    • 稳定性问题:如果列表项的顺序可能发生改变,使用索引作为key可能导致Vue在重新渲染时出现错误,因为索引并不能保证列表项的唯一性。
    • 相反,Vue也推荐使用每个列表项在数据集中的唯一标识作为key,比如一个具有唯一ID的数据库记录的ID字段。这样可以保证在列表发生变化时,Vue能够准确地识别每个列表项,并且能够更高效地进行更新和重渲染。
    • 使用唯一标识作为key的好处是,它能够确保在更新过程中每个列表项都能正确地被跟踪和识别,从而避免潜在的问题。
    • 总之,为了避免可能出现的问题,最好不要使用索引作为key,而是使用具有唯一性的标识符作为key,以确保Vue能够正确地管理和更新列表。
  10. 要是还没有理解 Diff 算法,我也总结了一波:Diff算法是用来比较两个文本或数据结构之间的差异,并找出它们之间的变化部分。Diff算法的工作原理可以简单概括为以下几个步骤:

    • 分解:将输入的文本或数据结构分解成更小的片段,比如将文本拆分成单词或句子。
    • 比较:对两个输入进行逐个元素的比较,找出它们之间的差异。
    • 匹配:尝试找到最长的相同子序列,以减少差异的数量。
    • 生成差异:根据比较结果生成描述性的差异表示,通常是一系列操作(如插入、删除、替换等)。
    • 应用变更:根据生成的差异,可以在需要的地方进行相应的更新操作,以反映两个输入之间的变化。
      通过Diff算法,我们可以高效地识别出两个文本或数据结构之间的变化,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IT系统可观测性

什么是可观测性 可观测性(Observability)是指能够从系统的外部输出推断出系统内部状态的能力。在IT和云计算领域,它涉及使用软件工具和实践来收集、关联和分析分布式应用程序以及运行这些应用程序的硬件和网络产生的性能数据流。这样做可以更…

数据分析-Pandas序列时间移动窗口化操作

数据分析-Pandas序列时间移动窗口化操作 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表…

【考研数学】全年保姆级规划+资料选择

直接跟考研课学即可 跟宋浩学第一遍说是基础,但宋浩的课程毕竟针对的是大学期末考试,基础知识方面讲的可能没有考研课程全面,毕竟大学课程的授课时间和考核要求不同于考研。 备考之前对自己做一个评估,每一个要准备的科目和其中…

代码随想录 动态规划-0-1背包问题

目录 标准0-1背包问题 二维dp数组01背包 一维dp数组01背包(滚动数组) 416.分割等和子集 1049.最后一块石头的重量|| 494.目标和 474.一和零 背包问题的分类 标准0-1背包问题 46. 携带研究材料(第六期模拟笔试) 时间限制…

超越传统的极限:解密B树与B+树的数据结构之美!

超越传统的极限:解密B树与B树的数据结构之美! B树和B树是在计算机科学中常用的平衡查找树数据结构,它们在处理大规模数据和磁盘存储方面具有重要的优势。本文将深入介绍B树和B树的基本概念、特点以及它们在数据库和文件系统中的应用&#xff…

【德语常识】分类单词

【德语常识】分类单词 一,Colors二,Countries & Languages三, 一,Colors 二,Countries & Languages 三,

JNDI注入原理及利用IDEA漏洞复现

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

VMware虚拟机Centos7硬盘扩容详细图文教程

这里写自定义目录标题 设置扩容空间容量10G为列子开机后输入df -h 查看磁盘空间运行fdisk -l,查看硬盘信息运行fdisk /dev/sda输入m,查看n为add new partition,输入n输入p ,p之后的东西都选择为默认再输入t,分区号根据…

洛谷-P1449 后缀表达式

目录 何为后缀表达式? 模拟过程 AC代码 采用STL的stack 题目链接:P1449 后缀表达式 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 何为后缀表达式? 那后缀表达式是怎么算的呢 那显然就需要引用最开始说的栈了 因为后缀表表达式本来就是栈…

HTML5+CSS3+JS小实例:全屏范围滑块

实例:全屏范围滑块 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…

零延迟轻量级网站指纹防御

文章信息 论文题目&#xff1a;Zero-delay Lightweight Defenses against Website Fingerprinting 期刊&#xff08;会议&#xff09;&#xff1a; 29th USENIX Security Symposium 时间&#xff1a;2020 级别&#xff1a;CCF A 文章链接&#xff1a;https://www.usenix.org/s…

PHP反序列化---字符串逃逸(增加/减少)

一、PHP反序列化逃逸--增加&#xff1a; 首先分析源码&#xff1a; <?php highlight_file(__FILE__); error_reporting(0); class A{public $v1 ls;public $v2 123;public function __construct($arga,$argc){$this->v1 $arga;$this->v2 $argc;} } $a $_GET[v…

一文了解如何做全基因集GSEA富集分析

原文链接:一文完成全基因集GSEA富集分析 本期内容 写在前面 我们前面分享过一文掌握单基因GSEA富集分析的教程,主要使用单基因的角度进行GSEA富集分析。 我们社群的同学咨询,全基因集的GSEA如何分析呢??其实,原理都是大同小异的,那么今天我们就简单的整理一下吧。 若…

PyTorch学习笔记之激活函数篇(二)

文章目录 2、Tanh函数2.1 公式2.2 对应的图像2.3 对应生成图像代码2.4 优点与不足2.5 torch.tanh()函数 2、Tanh函数 2.1 公式 Tanh函数的公式&#xff1a; f ( x ) e x − e − x e x e − x f(x)\frac{e^x-e^{-x}}{e^xe^{-x}} f(x)exe−xex−e−x​ Tanh函数的导函数&am…

Java实现定时发送邮件(基于Springboot工程)

1、功能概述&#xff1f; 1、在企业中有很多需要定时提醒的任务&#xff1a;如每天下午四点钟给第二天的值班人员发送值班消息&#xff1f;如提前一天给参与第二天会议的人员发送参会消息等。 2、这种定时提醒有很多方式如短信提醒、站内提醒等邮件提醒是其中较为方便且廉价的…

旅行社旅游线路预定管理系统asp.net

旅行社旅游线路预定管理系统 首页 国内游 境外游 旅游景点 新闻资讯 酒店信息―留言板 后台管理 后台管理导航菜单系统管理修改密码留言管理注册会员管理基础数据设置国别设置有份设地区设置 旅行社管理友情链接管理添加友情链接友情链接管理新闻资讯管理添加新闻资讯新闻资讯管…

10|代理(中):AgentExecutor究竟是怎样驱动模型和工具完成任务的?

LangChain 中的“代理”和“链”的差异究竟是什么&#xff1f;在链中&#xff0c;一系列操作被硬编码&#xff08;在代码中&#xff09;。在代理中&#xff0c;语言模型被用作推理引 擎来确定要采取哪些操作以及按什么顺序执行这些操作。 Agent 的关键组件 代理&#xff08…

静态综合实验

一&#xff0c;1.搭建拓扑结构并启动。 2.根据题意得该图需要14个网段&#xff0c;根据192.168.1.0/24划分子网段&#xff0c;如下&#xff1a; 划分完如图所示&#xff1a; 二、配置IP地址 R1路由器&#xff1a; 1.进入系统视图并改名. 2.接口配置IP地址&#xff1a…

Linux系统中安装Docker

用Linux既可以用虚拟机操作&#xff0c;也可以自己弄一个云服务器进行操作&#xff0c;两者没啥区别。 操作之前需要将用户等级升级到root级别&#xff0c;防止有些操作因为权限限制而不能操作。 安装docker非常简单&#xff0c;只需要一直按照下列命令顺序进行操作即可。 安装…

选Gitee还是GitHub?

2024年3月18日&#xff0c;周一晚上 我选择GitHub 因为GitHub可以无限创建仓库