成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

小紅書面試:v-for循環(huán),為什么不建議使用index作為key?

開發(fā) 前端
假如,我們使用 index 作為 key,同時使用 unshift 方法為數(shù)組添加了一個新的元素,那么所有的 index 都會發(fā)生變化,從而導(dǎo)致:isSameVNodeType 返回 false,即:所有的 dom 全部重新渲染 從而影響性能。

Hello,大家好,我是 Sunday。

最近有個同學(xué)在小紅書三面的時候遇到了一個面試題:“v-for循環(huán),為什么不建議使用index作為key?”

按說這個問題并不復(fù)雜,所以該同學(xué)直接回答:“使用 index 作為 key 可能會導(dǎo)致渲染性能問題,特別是數(shù)據(jù)源使用了 unshift 將數(shù)據(jù)添加到頭部時,會導(dǎo)致 index 被重新規(guī)劃,從而導(dǎo)致重新渲染。”

然后面試官繼續(xù)追問:“為什么 index 變化了就會導(dǎo)致 dom 重新渲染?它的渲染機(jī)制是什么?”

額... 吃了沒有看過源碼的虧,導(dǎo)致這個問題并沒有回答出來(但愿該同學(xué)這次小紅書面試可以順利通過,畢竟都到技術(shù)三面了)。

所以,咱們今天就針對這個面試題來說一下。

v-for 循環(huán)的渲染時機(jī)

在 Vue 的渲染中,有兩個比較重要的渲染時機(jī):渲染、更新。

  • 渲染:指的是 DOM 的首次渲染。首次的渲染性能的消耗是固定的。
  • 更新:指的是 數(shù)據(jù)變化后影響到的視圖變化,所謂的性能問題,主要就集中在這里。

我們以這段代碼為例,以下代碼表示的就是一段 更新 的邏輯:

<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 更新。

key 在渲染中的作用

同時,我們需要注意:針對于 v-for 的 dom 更新,一定是:兩組 dom 對比發(fā)生的變化。

而在 vue 中,一旦兩組 dom 對比更新,那么就會觸發(fā) diff 算法 的邏輯,而在 diff 中有這樣一段 vue 的源代碼 isSameVNodeType:

圖片圖片

這段代碼是用來判斷 兩個 DOM 是否相等的。

它的判斷條件有兩個:

  1. type:表示當(dāng)前 dom 的類型,比如:li、div、p 等不同標(biāo)簽名
  2. key:v-for 循環(huán)中綁定的 key 值

那么由此我們就可以知道:在 vue 中,通過 type + key 兩個屬性來判斷 dom 是否相等。

如果條件滿足(isSameVNodeType 返回 true),那么就不會重新渲染 dom,從而可以 提升性能

index 為什么會影響性能?

根據(jù)上面的內(nèi)容,我們可以知道:在 type 不變的前提下,key 就決定了 dom 是否要重新渲染。

假如,我們使用 index 作為 key,同時使用 unshift 方法為數(shù)組添加了一個新的元素,那么所有的 index 都會發(fā)生變化,從而導(dǎo)致:isSameVNodeType 返回 false,即:所有的 dom 全部重新渲染 從而影響性能

責(zé)任編輯:武曉燕 來源: 程序員Sunday
相關(guān)推薦

2024-03-11 11:02:03

Date類JavaAPI

2023-09-21 10:50:23

MySQL數(shù)據(jù)庫

2020-12-15 10:00:31

MySQL數(shù)據(jù)庫text

2020-11-17 09:01:09

MySQLDelete數(shù)據(jù)

2021-11-15 06:56:45

MyBatis開發(fā)項(xiàng)目

2024-07-29 08:20:10

2021-08-04 17:20:30

阿里巴巴AsyncJava

2021-10-13 14:06:46

MySQLUtf8符號

2020-12-24 18:46:11

Java序列化編程語言

2020-12-22 06:04:13

Python定時代碼

2020-04-01 17:50:02

Python編程語言

2019-02-27 09:00:13

阿里巴巴for循環(huán)Java

2019-01-29 10:30:32

阿里巴巴Java字符串

2020-06-23 14:09:49

枚舉JDK場景

2024-02-28 07:37:53

JavaExecutors工具

2022-02-06 10:58:37

Redis主從模式

2021-07-01 16:10:22

equals字符串Java

2021-01-26 21:00:24

SSL證書網(wǎng)絡(luò)安全加密

2021-03-10 09:40:50

Linux命令文件

2020-08-31 11:20:53

MySQLuuidid
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 69av网 | 91 在线| 一区二区三区免费在线观看 | 一区二区三区中文 | 日韩一级免费看 | 日韩在线免费观看视频 | 在线观看三级av | 一区二区精品 | 日本精品裸体写真集在线观看 | 欧美一区二区三区视频 | 在线视频一区二区 | 日韩欧美视频在线 | 久久综合九色综合欧美狠狠 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 黄免费看| 久久久久久亚洲精品 | 亚洲高清视频在线 | 亚洲精品一区二区 | 精品99久久久久久 | 日韩午夜电影在线观看 | 日韩久久精品电影 | 欧美一区视频 | 福利影院在线看 | 午夜免费看 | 伊人久久综合影院 | 日本一区二区三区免费观看 | 亚洲精品视频三区 | 毛片一区二区三区 | 日韩欧美不卡 | 国产精品美女久久久久aⅴ国产馆 | 亚洲午夜精品一区二区三区 | 国产一区亚洲 | 国产偷录视频叫床高潮对白 | 中文字字幕在线中文乱码范文 | 久久久久久久国产 | 国产精品久久久久久久岛一牛影视 | 91婷婷韩国欧美一区二区 | 亚洲欧洲成人av每日更新 | 亚洲在线一区 | 亚洲精品久久久 | 久久亚洲国产精品日日av夜夜 |