Vue深入理解之v-for中key的真正作用
前言
大家應(yīng)該都知道, v-for 中 key 最常用的綁定方式有兩種:
- 第一種用 index
- 第二種用 唯一 id
那么接下來筆者將用幾個(gè)小案例來講述這兩種方式在渲染時(shí)有什么明顯的差別。
第一種: key 采用 index
我們先來看看代碼
<template> <div class="root"> <div class="item" v-for="(item, index) in list" :key="index"> <h2>{{ item.text }}</h2> </div> <button @click="replaceData">替換數(shù)據(jù)</button> </div> </template> <script> export default { data() { return { list: [ {text: '33333'}, {text: '66666'}, {text: '99999'}, ] } }, methods: { replaceData() { this.list = [ {text: '22222'}, {text: '44444'}, {text: '88888'}, ] } } } </script> <style lang="scss"> .item{ background: orange;} </style>
這里我們渲染了 list 數(shù)組,并將 index 作為 key ,然后還添加一個(gè)替換數(shù)據(jù)按鈕事件,我們來看看效果
當(dāng)我們點(diǎn)擊替換數(shù)據(jù) 這個(gè)按鈕時(shí),數(shù)據(jù)變成這樣
一切看起來很正常對(duì)吧,接下來就是重點(diǎn)了,我們要做點(diǎn)小改動(dòng),首先我們先刷新下頁面讓數(shù)據(jù)恢復(fù)成原來的,然后我們將第二條給手動(dòng)刪掉
現(xiàn)在僅剩下 33333 和 99999,此時(shí)我們?nèi)c(diǎn)擊替換數(shù)據(jù) 看看有什么效果
咦,它只替換了第一條和第三條,原來的第二條被我們剛剛刪掉了,導(dǎo)致 44444 沒有渲染出來,這是為啥呢?其實(shí)很簡(jiǎn)單,因?yàn)樘鎿Q數(shù)據(jù)那批數(shù)組的 index 跟第一批數(shù)組是一樣,Vue 判斷是相同后又何必創(chuàng)建 Dom 這種浪費(fèi)資源的操作呢,所以它并不會(huì)給第二條重新創(chuàng)建 Dom ,這便是 index 作為 key 的作用。
Note:表面視圖沒變化,但數(shù)據(jù)是有更新的,你去訪問 list時(shí),里面還是有三條數(shù)據(jù)22222,44444, 88888,只要記住 Vue 是以數(shù)據(jù)為驅(qū)動(dòng)而不是視圖。
第二種:key 采用唯一 ID
接下來我們來看下第二種,代碼如下
<template> <div class="root"> <div class="item" v-for="(item) in list" :key="item.id"> <h2>{{ item.text }}</h2> </div> <button @click="replaceData">替換數(shù)據(jù)</button> </div> </template> <script> export default { data() { return { list: [ {text: '33333', id: 1}, {text: '66666', id: 2}, {text: '99999', id: 3}, ] } }, methods: { replaceData() { this.list = [ {text: '22222', id: 4}, {text: '44444', id: 5}, {text: '88888', id: 6} ] } } } </script> <style lang="scss"> .item{ background: orange;} </style>
代碼和上面差不多,只是新增了 id 并綁定到 key 里面,
接下來我們參考上面的流程走一遍看看這次有什么不同之處。
聰明的你已經(jīng)看出來了,刪掉第二條后,點(diǎn)擊調(diào)換數(shù)據(jù) 會(huì)生成新的三條出來,而不是兩條,原理我相信你也懂了,替換數(shù)據(jù)的那批 id 與上一批不一樣,所以 Vue 比較后發(fā)現(xiàn)不同就幫我們生成新的 Dom
以上便是使用 index 和 唯一 id 的明顯區(qū)別
另外,像 唯一id 不止上面這一種綁定方式,我們也可以在 v-for 里面使用 :key="Math.random()" 生成唯一id,但這種會(huì)有一些細(xì)微的差別,這里筆者就不去舉例了,至于使用哪種 key 可以提升性能方面的相關(guān)知識(shí)不是本章的初衷,讀者可以自行到網(wǎng)上搜索,相信你只要能理解上面這兩種綁定 key 的作用差別在哪里,那么其它的綁定方式對(duì)你來講一定不是難題。
總結(jié)
到此這篇關(guān)于Vue深入理解之v-for中key真正作用的文章就介紹到這了,更多相關(guān)Vue v-for中key作用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一篇文章,教你學(xué)會(huì)Vue CLI 插件開發(fā)
這篇文章主要介紹了Vue CLI插件開發(fā),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04關(guān)于Echarts餅圖圖例太長(zhǎng)的解決方案
這篇文章主要介紹了關(guān)于Echarts餅圖圖例太長(zhǎng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Vue動(dòng)態(tài)設(shè)置img的src不生效的問題解決
本文主要介紹了Vue動(dòng)態(tài)設(shè)置img的src不生效的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01vue項(xiàng)目中添加electron的詳細(xì)代碼
這篇文章通過實(shí)例代碼給大家介紹了vue項(xiàng)目中添加electron的方法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-11-11