最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Vue中加上key后發(fā)生什么

 更新時(shí)間:2023年04月16日 16:31:34   作者:舟羽  
本文主要介紹了一文詳解Vue中加上key后發(fā)生什么,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近接手了一個(gè)Vue項(xiàng)目,很多的代碼片段使用到了key, 結(jié)合自己以前接觸key的經(jīng)歷,于是思考,在Vue中加上key發(fā)生了什么? 最后翻找資料,寫(xiě)下這篇博客記錄。

什么是Key

在Vue中,我們通常會(huì)使用v-for指令來(lái)渲染列表。 當(dāng)數(shù)據(jù)源發(fā)生改變時(shí),Vue會(huì)盡可能高效地更新DOM元素以反映這些變化。 然而,在某些情況下,Vue無(wú)法跟蹤并處理到底哪些元素發(fā)生了變化。

當(dāng)一個(gè)Vue組件的狀態(tài)發(fā)生改變時(shí),Vue會(huì)重新渲染組件反應(yīng)出這些變化。 但是,如果這個(gè)Vue組件中包含列表,那么每次重新渲染時(shí),都要重新創(chuàng)建這個(gè)列表。 當(dāng)這個(gè)列表發(fā)生以下操作時(shí),都會(huì)重新更新整個(gè)列表。 如果這個(gè)列表的數(shù)據(jù)量很大的時(shí)候,這樣操作會(huì)極大影響性能。

  • 新增或刪除列表項(xiàng)
  • 對(duì)比列表項(xiàng)發(fā)現(xiàn)位置已經(jīng)變動(dòng)
  • 通過(guò)第三方插件對(duì)列表進(jìn)行操作

為了解決上述問(wèn)題,Vue引入了一種特殊屬性——key。

Key是用來(lái)追蹤哪些元素被新增、被修改、被刪除的輔助標(biāo)識(shí)。在進(jìn)行前后對(duì)比時(shí), 會(huì)基于Key的變化判斷是復(fù)用現(xiàn)有DOM節(jié)點(diǎn)還是銷(xiāo)毀再重建,從而提高Vue的渲染效率和性能。

在Vue的虛擬DOM算法中,同級(jí)別的元素之間互相比較是按照它們的先后順序進(jìn)行遍歷的。 如果可復(fù)用的元素沒(méi)有設(shè)置Key,則會(huì)按照就近原則,配對(duì)成功后更新差異,這可能導(dǎo)致內(nèi)部狀態(tài)混亂。

key的作用

key屬性用于標(biāo)識(shí)一個(gè)元素的唯一性,當(dāng)列表中的數(shù)據(jù)發(fā)生改變時(shí),Vue會(huì)根據(jù)key值來(lái)對(duì)比哪些數(shù)據(jù)是新的,哪些數(shù)據(jù)是舊的, 從而渲染新的數(shù)據(jù),而不用渲染整個(gè)列表。

  • Key可以告訴Vue哪些元素是新增的,哪些元素已經(jīng)不存在了,進(jìn)而更好地掌握整個(gè)組件內(nèi)部的狀態(tài)。
  • 通過(guò)給每個(gè)元素添加key,Vue可以更加精確地知道哪些元素被修改了,減少內(nèi)部狀態(tài)混亂和無(wú)謂的DOM操作,從而提高性能。

舉個(gè)??

<template>
  <ul>
    <li v-for="item in items" :key="item.id">
      {{ item.name }}
    </li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' }
      ]
    };
  },
  mounted() {
    setInterval(() => {
      this.items.push({ id: Date.now(), name: 'New Item' });
    }, 1000);
  }
};
</script>

在這個(gè)例子中,我們使用v-for指令來(lái)渲染一個(gè)列表,并為每個(gè)列表項(xiàng)設(shè)置了一個(gè)key屬性。 同時(shí)使用setInterval函數(shù)來(lái)定時(shí)添加新的列表項(xiàng)。

如果我們不使用key屬性,那么每次添加新的列表項(xiàng)時(shí),Vue都會(huì)重新渲染整個(gè)列表。 這樣會(huì)導(dǎo)致性能問(wèn)題,并且會(huì)破壞一些用戶交互效果。 但是,如果我們使用key屬性,Vue就可以根據(jù)每個(gè)列表項(xiàng)的唯一標(biāo)識(shí)來(lái)判斷哪些是新的,哪些是舊的。 這樣就可以只更新需要更新的元素,而不是重新渲染整個(gè)列表。

key的底層原理

我們先來(lái)了解Vue中實(shí)現(xiàn)key的底層原理步驟:

  • 創(chuàng)建一份當(dāng)前的虛擬DOM和上一次的虛擬DOM;
  • 在數(shù)據(jù)發(fā)生改變后,vue會(huì)通過(guò)比較新舊虛擬DOM的差異來(lái)計(jì)算出需要對(duì)哪些DOM元素進(jìn)行何種類(lèi)型的操作(新增、刪除、移動(dòng)等);
  • 如果某個(gè)元素上添加了key屬性,在計(jì)算差異時(shí)vue就會(huì)將其作為參考,如果兩次數(shù)據(jù)更新時(shí),某個(gè)元素的key值沒(méi)有發(fā)生變化,則代表這個(gè)元素沒(méi)有發(fā)生位置變化,vue會(huì)直接復(fù)用它,而不是重新渲染。

修改上面的??

<template>
    <button @click="add">Add Fruit</button>
    <ul>
        <li v-for="item in items" :key="item.id">
            {{ item.name }}
        </li>
    </ul>
</template>
<script>
    data() {
    return {
        items: [
        { id: 1, name: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' }
        ]
    };
    },
    methods:{
    add(){
        const fruit = {'id':'4', 'name':'Chestnut'}
        this.items.unshift(fruit)
    }
}
</script>

當(dāng)vue第一次渲染時(shí),會(huì)根據(jù)items 中的數(shù)據(jù)加載生成虛擬DOM,同時(shí)綁定key值,最后加載為以下的真實(shí)DOM節(jié)點(diǎn)。

<li key="1">Apple</li>
<li key="2">Banana</li>
<li key="3">Orange</li>

當(dāng)我們點(diǎn)擊 button 按鈕后,items 數(shù)據(jù)源發(fā)生變化,此時(shí)vue仍進(jìn)行渲染,再次生成虛擬DOM,不過(guò)會(huì)對(duì)比上一次生成的虛擬DOM,最后根據(jù)綁定的key值重新渲染,加載為以下的真實(shí)DOM節(jié)點(diǎn)。

<li key="1">Apple</li>
<li key="2">Banana</li>
<li key="3">Orange</li>
<li key="4">Chestnut</li>

到此這篇關(guān)于一文詳解Vue中加上key后發(fā)生什么的文章就介紹到這了,更多相關(guān)Vue  key 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Vue2x實(shí)現(xiàn)響應(yīng)式自適應(yīng)輪播組件插件VueSliderShow功能

    基于Vue2x實(shí)現(xiàn)響應(yīng)式自適應(yīng)輪播組件插件VueSliderShow功能

    本文講述的是從開(kāi)發(fā)一款基于Vue2x的響應(yīng)式自適應(yīng)輪播組件插件的一個(gè)全過(guò)程,包含發(fā)布到npm,構(gòu)建自己的npm包,供下載安裝使用的技巧,非常不錯(cuò),具有一定的參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • vue3.0報(bào)錯(cuò)Cannot?find?module‘worker_threads‘的解決辦法

    vue3.0報(bào)錯(cuò)Cannot?find?module‘worker_threads‘的解決辦法

    這篇文章介紹了vue3.0報(bào)錯(cuò)Cannot?find?module‘worker_threads‘的解決辦法。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • vue使用swiper.js重疊輪播組建樣式

    vue使用swiper.js重疊輪播組建樣式

    這篇文章主要為大家詳細(xì)介紹了vue使用swiper.js重疊輪播組建樣式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Element如何實(shí)現(xiàn)loading的方法示例

    Element如何實(shí)現(xiàn)loading的方法示例

    本文主要介紹了Element如何實(shí)現(xiàn)loading的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 使用Vue創(chuàng)建前后端分離項(xiàng)目的完整過(guò)程(前端部分)

    使用Vue創(chuàng)建前后端分離項(xiàng)目的完整過(guò)程(前端部分)

    這篇文章主要介紹了使用Vue.js和Node.js搭建一個(gè)前端和后端分離的項(xiàng)目,并使用VueCLI3腳手架、axios進(jìn)行HTTP請(qǐng)求、Vue-router實(shí)現(xiàn)前端路由和vuex進(jìn)行狀態(tài)管理,需要的朋友可以參考下
    2025-01-01
  • vue2自定義組件通過(guò)rollup配置發(fā)布到npm的詳細(xì)步驟

    vue2自定義組件通過(guò)rollup配置發(fā)布到npm的詳細(xì)步驟

    這篇文章主要介紹了vue2自定義組件通過(guò)rollup配置發(fā)布到npm,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 前端Vue單元測(cè)試入門(mén)教程

    前端Vue單元測(cè)試入門(mén)教程

    單元測(cè)試是用來(lái)測(cè)試項(xiàng)目中的一個(gè)模塊的功能,本文主要介紹了前端Vue單元測(cè)試入門(mén)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 詳解為什么Vue中的v-if和v-for不建議一起用

    詳解為什么Vue中的v-if和v-for不建議一起用

    這篇文章主要介紹了面試官:為什么Vue中的v-if和v-for不建議一起用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • element-ui實(shí)現(xiàn)表格邊框的動(dòng)態(tài)切換并防抖

    element-ui實(shí)現(xiàn)表格邊框的動(dòng)態(tài)切換并防抖

    這篇文章主要介紹了element-ui實(shí)現(xiàn)表格邊框的動(dòng)態(tài)切換并防抖方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue全局自適應(yīng)大小:使用postcss-pxtorem方式

    Vue全局自適應(yīng)大小:使用postcss-pxtorem方式

    本文介紹了如何在Vue項(xiàng)目中使用postcss-pxtorem插件實(shí)現(xiàn)響應(yīng)式設(shè)計(jì),postcss-pxtorem可以自動(dòng)將CSS文件中的px單位轉(zhuǎn)換為rem單位,從而實(shí)現(xiàn)更好的自適應(yīng)布局,通過(guò)配置postcss-pxtorem插件,可以在構(gòu)建時(shí)自動(dòng)完成轉(zhuǎn)換,無(wú)需手動(dòng)修改代碼
    2025-01-01

最新評(píng)論

朝阳县| 麻城市| 吴堡县| 尚志市| 武汉市| 防城港市| 遵义市| 隆子县| 旺苍县| 乐昌市| 富锦市| 东乡族自治县| 都安| 南木林县| 团风县| 额济纳旗| 玉树县| 繁昌县| 山阳县| 丽水市| 周至县| 灵璧县| 若尔盖县| 惠州市| 汾西县| 慈利县| 定州市| 利辛县| 津市市| 东乡族自治县| 祁连县| 侯马市| 桦南县| 鲁山县| 大关县| 永靖县| 印江| 富蕴县| 唐海县| 花垣县| 定日县|