Vue中key的原理以及diff算法詳解
Vue中key的原理以及diff算法
簡介
Vue的key用于在虛擬DOM中標(biāo)記節(jié)點(diǎn),方便后面的diff對比算法進(jìn)行對比,提升效率。
Vue的vm或者vc實(shí)例一共管理著3個DOM對象
分別他的模板對應(yīng)的真實(shí)DOM、真實(shí)DOM的備份、以及重新生成的新的DOM,后兩個可以看成是虛擬DOM,只要后面兩個DOM的DOM樹的葉子或者節(jié)點(diǎn)不一樣(被指令操作虛擬DOM進(jìn)行了修改),那么就會通過渲染函數(shù)render重新更新HTML頁面上的真實(shí)DOM。
使用列表渲染時(shí)
會生成新的節(jié)點(diǎn),這些節(jié)點(diǎn)不是一開始在模板當(dāng)中寫的,屬于后來的DOM節(jié)點(diǎn),所以需要特殊管理。
列表渲染新生成的DOM節(jié)點(diǎn)一般是一棵子DOM樹
使用key可以記錄這棵子樹的根節(jié)點(diǎn),diff差分算法就是根據(jù)從這個子樹的根節(jié)點(diǎn)開始進(jìn)行對比,判斷DOM節(jié)點(diǎn)是否發(fā)生變化。
- 如果發(fā)現(xiàn)key不存在,直接創(chuàng)建新的子樹。
- 如果key存在,則會對子樹遍歷。但是對于一些在HTML中的真實(shí)DOM中存在的內(nèi)容,比如input框里面的內(nèi)容,Vue是不知道的,因?yàn)閂ue只有一開始真實(shí)DOM的備份,后面這個HTML頁面上的真實(shí)DOM發(fā)生了什么變化Vue是不知道的。這就會導(dǎo)致真實(shí)DOM的一部分被替換掉,而另外一部分還是殘留的老的真實(shí)DOM。
如果遍歷容器時(shí)
使用index作為key,則會出現(xiàn)部分真實(shí)DOM殘留的問題。實(shí)際開發(fā)中,一般使用獨(dú)一無二的index作為key。
總結(jié)如下
- 最好使用每條數(shù)據(jù)的唯一標(biāo)識作為key,比如id、手機(jī)號、身份證號、學(xué)號等唯一值
- 如果不存在對數(shù)組數(shù)據(jù)的逆序添加、逆序刪除等破壞順序的操作,僅用于渲染列表,使用index作為key是沒有問題的

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue使用transition組件動畫效果的實(shí)例代碼
這篇文章主要介紹了vue使用transition組件動畫效果的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
使用Vue3實(shí)現(xiàn)在瀏覽器端進(jìn)行zip文件壓縮
在前端開發(fā)中,我們時(shí)常需要處理文件上傳和下載的功能,本文主要和大家分享一下如何使用Vue3和JSZip庫在瀏覽器端實(shí)現(xiàn)zip文件壓縮,需要的可以參考下2024-05-05
在Vue環(huán)境下利用worker運(yùn)行interval計(jì)時(shí)器的步驟
這篇文章主要介紹了在Vue環(huán)境下利用worker運(yùn)行interval計(jì)時(shí)器的步驟,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
基于Vue3的打卡計(jì)時(shí)器實(shí)現(xiàn)方案
在日常工作和生活中,我們經(jīng)常需要記錄時(shí)間間隔,比如工作打卡、學(xué)習(xí)時(shí)長、項(xiàng)目耗時(shí)等,今天我將為大家介紹一個基于Vue3的打卡計(jì)時(shí)器實(shí)現(xiàn)方案,需要的朋友可以參考下2026-03-03
element修改form的el-input寬度,el-select寬度的方法實(shí)現(xiàn)
有時(shí)候像form表單這樣,頁面的input、select等寬度不一定會是一樣的,可能有些長,有些短,本文就介紹了如何element修改form的el-input寬度,el-select寬度的方法實(shí)現(xiàn),感興趣的可以了解一下2022-02-02

