当前位置:首页 > 科技  > 软件

小红书面试:v-for循环,为什么不建议使用index作为key?

来源: 责编: 时间:2024-04-24 17:31:44 277观看
导读Hello,大家好,我是 Sunday。最近有个同学在小红书三面的时候遇到了一个面试题:“v-for循环,为什么不建议使用index作为key?”按说这个问题并不复杂,所以该同学直接回答:“使用 index 作为 key 可能会导致渲染性能问题,特别是

Hello,大家好,我是 Sunday。S0m28资讯网——每日最新资讯28at.com

最近有个同学在小红书三面的时候遇到了一个面试题:“v-for循环,为什么不建议使用index作为key?”S0m28资讯网——每日最新资讯28at.com

按说这个问题并不复杂,所以该同学直接回答:“使用 index 作为 key 可能会导致渲染性能问题,特别是数据源使用了 unshift 将数据添加到头部时,会导致 index 被重新规划,从而导致重新渲染。”S0m28资讯网——每日最新资讯28at.com

然后面试官继续追问:“为什么 index 变化了就会导致 dom 重新渲染?它的渲染机制是什么?”S0m28资讯网——每日最新资讯28at.com

额... 吃了没有看过源码的亏,导致这个问题并没有回答出来(但愿该同学这次小红书面试可以顺利通过,毕竟都到技术三面了)。S0m28资讯网——每日最新资讯28at.com

所以,咱们今天就针对这个面试题来说一下。S0m28资讯网——每日最新资讯28at.com

v-for 循环的渲染时机

在 Vue 的渲染中,有两个比较重要的渲染时机:渲染、更新。S0m28资讯网——每日最新资讯28at.com

  • 渲染:指的是 DOM 的首次渲染。首次的渲染性能的消耗是固定的。
  • 更新:指的是 数据变化后影响到的视图变化,所谓的性能问题,主要就集中在这里。

我们以这段代码为例,以下代码表示的就是一段 更新 的逻辑:S0m28资讯网——每日最新资讯28at.com

<template> <div>  <ul>   <li v-for="(item, index) in list" :key="index">{{ item }}</li>  </ul>  <button @click="change">change</button> </div></template><script setup>const list = ref([1, 2, 3])const change = () => { list.value = [3, 2, 1]}</script>

如果我们把 [1, 2, 3] 作为一组 dom,把 [3, 2, 1] 作为另外一组 dom,那么 dom 由 [1, 2, 3] 变成 [3, 2, 1] 的过程就是 DOM 更新。S0m28资讯网——每日最新资讯28at.com

key 在渲染中的作用

同时,我们需要注意:针对于 v-for 的 dom 更新,一定是:两组 dom 对比发生的变化。S0m28资讯网——每日最新资讯28at.com

而在 vue 中,一旦两组 dom 对比更新,那么就会触发 diff 算法 的逻辑,而在 diff 中有这样一段 vue 的源代码 isSameVNodeType:S0m28资讯网——每日最新资讯28at.com

图片图片S0m28资讯网——每日最新资讯28at.com

这段代码是用来判断 两个 DOM 是否相等的。S0m28资讯网——每日最新资讯28at.com

它的判断条件有两个:S0m28资讯网——每日最新资讯28at.com

  1. type:表示当前 dom 的类型,比如:li、div、p 等不同标签名
  2. key:v-for 循环中绑定的 key 值

那么由此我们就可以知道:在 vue 中,通过 type + key 两个属性来判断 dom 是否相等。S0m28资讯网——每日最新资讯28at.com

如果条件满足(isSameVNodeType 返回 true),那么就不会重新渲染 dom,从而可以 提升性能S0m28资讯网——每日最新资讯28at.com

index 为什么会影响性能?

根据上面的内容,我们可以知道:在 type 不变的前提下,key 就决定了 dom 是否要重新渲染。S0m28资讯网——每日最新资讯28at.com

假如,我们使用 index 作为 key,同时使用 unshift 方法为数组添加了一个新的元素,那么所有的 index 都会发生变化,从而导致:isSameVNodeType 返回 false,即:所有的 dom 全部重新渲染 从而影响性能S0m28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-85223-0.html小红书面试:v-for循环,为什么不建议使用index作为key?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 十个每个程序员都应该知道的JavaScript技巧

下一篇: 大白话讲解Rust中令人头痛的“所有权”

标签:
  • 热门焦点
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top