亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

什么是Key

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

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

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

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

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

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

key的作用

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

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

舉個??

<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>

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

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

key的底層原理

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

  • 創(chuàng)建一份當(dāng)前的虛擬DOM和上一次的虛擬DOM;
  • 在數(shù)據(jù)發(fā)生改變后,vue會通過比較新舊虛擬DOM的差異來計(jì)算出需要對哪些DOM元素進(jìn)行何種類型的操作(新增、刪除、移動等);
  • 如果某個元素上添加了key屬性,在計(jì)算差異時vue就會將其作為參考,如果兩次數(shù)據(jù)更新時,某個元素的key值沒有發(fā)生變化,則代表這個元素沒有發(fā)生位置變化,vue會直接復(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第一次渲染時,會根據(jù)items 中的數(shù)據(jù)加載生成虛擬DOM,同時綁定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ā)生變化,此時vue仍進(jìn)行渲染,再次生成虛擬DOM,不過會對比上一次生成的虛擬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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • element實(shí)現(xiàn)合并單元格通用方法

    element實(shí)現(xiàn)合并單元格通用方法

    這篇文章主要介紹了element實(shí)現(xiàn)合并單元格通用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue el-form-item如何添加icon和tooltip

    vue el-form-item如何添加icon和tooltip

    這篇文章主要介紹了vue el-form-item如何添加icon和tooltip問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • element-ui 設(shè)置菜單欄展開的方法

    element-ui 設(shè)置菜單欄展開的方法

    今天小編就為大家分享一篇element-ui 設(shè)置菜單欄展開的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Vue?Router嵌套路由(children)的用法小結(jié)

    Vue?Router嵌套路由(children)的用法小結(jié)

    嵌套路由就是父路由里面嵌套他的子路由,父路由有自己的路由導(dǎo)航和路由容器(router-link、router-view),通過配置children可實(shí)現(xiàn)多層嵌套,這篇文章主要介紹了Vue--Router--嵌套路由(children)的用法,需要的朋友可以參考下
    2022-08-08
  • vue3?HighCharts自定義封裝之徑向條形圖的實(shí)戰(zhàn)過程

    vue3?HighCharts自定義封裝之徑向條形圖的實(shí)戰(zhàn)過程

    highcharts是國外知名基于javascript的圖表庫,下面這篇文章主要給大家介紹了關(guān)于vue3?HighCharts自定義封裝之徑向條形圖的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • vue中的echarts實(shí)現(xiàn)寬度自適應(yīng)的解決方案

    vue中的echarts實(shí)現(xiàn)寬度自適應(yīng)的解決方案

    這篇文章主要介紹了vue中的echarts實(shí)現(xiàn)寬度自適應(yīng),本文給大家分享實(shí)現(xiàn)方案,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • vue中$set與$delete的使用及說明

    vue中$set與$delete的使用及說明

    這篇文章主要介紹了vue中$set與$delete的使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vite+vue3+element-plus項(xiàng)目搭建的方法步驟

    vite+vue3+element-plus項(xiàng)目搭建的方法步驟

    因?yàn)関ue3出了一段時間了,element也出了基于vue3.x版本的element-plus,vite打包聽說很快,嘗試一下,感興趣的可以了解一下
    2021-06-06
  • fetch網(wǎng)絡(luò)請求封裝示例詳解

    fetch網(wǎng)絡(luò)請求封裝示例詳解

    這篇文章主要介紹了fetch網(wǎng)絡(luò)請求封裝的示例內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • vue返回上一頁面時不刷新問題及解決方案

    vue返回上一頁面時不刷新問題及解決方案

    這篇文章主要介紹了vue返回上一頁面時不刷新問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論