Vue 列表渲染 key的原理和作用詳解
列表渲染 key 的原理和作用
key就是為該節(jié)點(diǎn)做身份標(biāo)識(shí),如果對(duì)key綁定index的值,那么很容易出現(xiàn)問(wèn)題:
1.若對(duì)數(shù)據(jù)進(jìn)行:逆序添加、逆序刪除等破壞順序操作,會(huì)產(chǎn)生沒(méi)有必要的真實(shí)DOM更新——頁(yè)面效果沒(méi)有問(wèn)題,但是效率有2問(wèn)題
2.如果解構(gòu)中還包含輸入類(lèi)的DOM,會(huì)產(chǎn)生錯(cuò)誤DOM更新——界面有問(wèn)題
問(wèn)題案例分析:
點(diǎn)擊按鈕,在列表的前面添加一個(gè)對(duì)象
<div id="root">
<button @click.once="add">添加一個(gè)老劉</button>
<ul>
<li v-for="(p, index) in persons" :key="index">
{{p.name}}---{{p.age}}
<input type="text">
</li>
</ul>
</div>
var vm = new Vue({
el:"#root",
data:{
persons:[
{id:"001", name:"張三", age:15},
{id:"002", name:"李四", age:16},
{id:"003", name:"王五", age:17}
]
},
methods: {
add(){
const p = {id:"004", name:"老劉", age:20}
this.persons.unshift(p)
}
},
})
展現(xiàn)出來(lái)是這樣的一個(gè)效果

當(dāng)我們將姓名填入輸入框中

然后點(diǎn)擊按鈕,觀察出現(xiàn)的問(wèn)題

我們會(huì)發(fā)現(xiàn),表單的最上方出現(xiàn)了老劉,但是列表中的內(nèi)容和輸入框的內(nèi)容并沒(méi)有相等
解決方法:我們將:key="index"改為:key="id"
key的原理分析

初始數(shù)據(jù)
拿到初始數(shù)據(jù)根據(jù)初始數(shù)據(jù)生成 虛擬DOM將虛擬DOM轉(zhuǎn)為真實(shí)的DOM
新數(shù)據(jù)
拿到新的數(shù)據(jù)(包含老劉)根據(jù)數(shù)據(jù)生成 虛擬DOM虛擬DOM與初始數(shù)據(jù)的虛擬DOM進(jìn)行對(duì)比算法(li中的文本信息出現(xiàn)了差異,但是input是相同的,虛擬的DOM是沒(méi)有數(shù)據(jù)的,在頁(yè)面輸入的內(nèi)容存儲(chǔ)在真實(shí)的DOM中)文本信息——新數(shù)據(jù)替代了初始數(shù)據(jù),input內(nèi)容被保留
key的作用

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
vue :src 文件路徑錯(cuò)誤問(wèn)題的解決方法
這篇文章主要介紹了vue :src 文件路徑錯(cuò)誤問(wèn)題的簡(jiǎn)單解決方法,本文分步驟給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
vue后臺(tái)管理添加多語(yǔ)言功能的實(shí)現(xiàn)示例
這篇文章主要介紹了vue后臺(tái)管理添加多語(yǔ)言功能的實(shí)現(xiàn)示例,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-04-04
在 Vue 中編寫(xiě) SVG 圖標(biāo)組件的方法
這篇文章主要介紹了在 Vue 中編寫(xiě) SVG 圖標(biāo)組件的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
vue多頁(yè)面項(xiàng)目中路由使用history模式的方法
這篇文章主要介紹了vue多頁(yè)面項(xiàng)目中路由如何使用history模式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
淺談vue引用靜態(tài)資源需要注意的事項(xiàng)
今天小編就為大家分享一篇淺談vue引用靜態(tài)資源需要注意的事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue3頁(yè)面組件中怎么獲取上一個(gè)頁(yè)面的路由地址
這篇文章主要給大家介紹了關(guān)于vue3頁(yè)面組件中怎么獲取上一個(gè)頁(yè)面的路由地址的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-02-02
Vue-router 報(bào)錯(cuò)NavigationDuplicated的解決方法
這篇文章主要介紹了Vue-router 報(bào)錯(cuò)NavigationDuplicated的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
利用Vue.js實(shí)現(xiàn)求職在線之職位查詢(xún)功能
Vue.js是當(dāng)下很火的一個(gè)JavaScript MVVM庫(kù),它是以數(shù)據(jù)驅(qū)動(dòng)和組件化的思想構(gòu)建的。下面這篇文章主要給大家介紹了關(guān)于利用Vue.js實(shí)現(xiàn)求職在線之職位查詢(xún)功能的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07
vue3使用element-plus中el-table組件報(bào)錯(cuò)關(guān)鍵字'emitsOptions'與&
這篇文章主要給大家介紹了關(guān)于vue3使用element-plus中el-table組件報(bào)錯(cuò)關(guān)鍵字'emitsOptions'與'insertBefore'的相關(guān)資料,文中將解決方法介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10

