日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解vue中v-for的key唯一性

瀏覽:19日期:2022-09-29 15:15:04
目錄1. DOM Diff2. 為同一層的相同類型的元素添加 key 屬性3. key 不能是 index 下標值1. DOM Diff

要想真正了解 key 屬性的存在意義,還真得從 DOM Diff 說起,并不需要深入了解 DOM Diff 的原理,而是僅僅需要知道 DOM Diff 的工作過程即可。

Vue 和 React 都采用了運用虛擬 DOM 的方式減少瀏覽器不必要的渲染。由于 Vue 和 React 采用的都是 v = render( m ) 的方式渲染視圖的,當 model 數(shù)據(jù)發(fā)生變化時,視圖更新的方式就是重新 render DOM 元素。但是有時候我們只是改變了一個組件中的某一個 div 中的數(shù)據(jù),如果采用原生 render 的方式去更新視圖的話,那整個組件都要更新。豈不浪費時間?

我們?nèi)粘I钪信龅竭@樣的情況可不會全部更新,就像一個拼圖拼好了,后來其中一小塊需要更換,我們找到拿一塊直接替換就好了,絕不會說再從頭拼一次。Vue 和 React 的開發(fā)者也是這樣想的,就去想方設法優(yōu)化。

我們?nèi)搜垡谎劬涂梢钥闯龈淖兦昂透淖兒蟮牟煌帲桓虏煌幘涂梢粤?。但計算機可一眼看不出來,它必須從頭一塊快地對比,直至找到不同之處進行更新。這個將改變前和改變后進行對比找不同的過程就是 DOM Diff,DOM Diff 中的 DOM 是虛擬 DOM,也就是 JavaScript 對象,一一比較找到不同之處后,就去局部更新真正的 DOM。

在比較的過程中, 虛擬 DOM 也會構(gòu)成一棵虛擬 DOM 樹,DOM Diff 的工作過程就是比較兩棵虛擬 DOM 樹上的對象節(jié)點,具體就是每一層和每一層的對應位置進行比較。正是因為計算機只會比較每一層對應位置的的兩個虛擬 DOM 元素,如果這兩棵樹中改變后的樹的某一層只是插入了一個節(jié)點,那樹的結(jié)構(gòu)是不變的,DOM Diff 在比較這一層的時候就會導致錯位比較了,如下圖所示:

詳解vue中v-for的key唯一性

因為這一層的虛擬 DOM 節(jié)點對于 Vue 和 React 來說除了 DOM 節(jié)點本身外是完全沒有任何不同的,所以 DOM Diff 在比較的時候就只能按照對應位置一一比較了。

一一比較后,如果節(jié)點類型相同,那么就會復用該節(jié)點,單單局部更新該節(jié)點內(nèi)不同的內(nèi)容處。就像上述圖中的,如果這是 ul 下的 li 的虛擬 DOM 節(jié)點的話,那一一比較后發(fā)現(xiàn)節(jié)點類型相同,就復用之前的節(jié)點,將節(jié)點里面的內(nèi)容進行改變,也就是,將C更新成F,D更新成C,E更新成D,最后再插入E。

上述是插入節(jié)點的情況,帶來的后果就是效率上的降低,但如果是刪除節(jié)點的情況,那帶來的后果可就不僅僅是效率了。

假如是點擊一個按鈕刪除一個 li 元素,那新舊虛擬 DOM 樹進行比較的時候,還是根據(jù)樹中每一層的對應位置一一比較,比如刪除后的 [1,2,3] 變成了 [1,3],它就會將第一個 li 和第二個 li 相比較,發(fā)現(xiàn)元素類型沒有變化,就會復用第一個 li,再遞歸對比 li 里面的,發(fā)現(xiàn)都沒變化就繼續(xù)復用。到了第二個 li 之間比較的時候,發(fā)現(xiàn)也都是 li 元素,那就會復用之前的li,單單將 2 變成了 3。

此時,如果復用的 li 中有子元素的話,子元素依賴的數(shù)據(jù)沒有發(fā)生變化的話,就會繼續(xù)復用之前的子組件,這樣就會導致一個錯位,如下圖:

詳解vue中v-for的key唯一性

2. 為同一層的相同類型的元素添加 key 屬性

在上述的 DOM Diff 算法中,比較的僅僅是兩棵樹同一層的對應位置,在不同層之前的元素之間是不需要比較的,而且,當 DOM Diff 的過程中發(fā)現(xiàn),改變后的虛擬 DOM 和之前的虛擬 DOM 類型不同的時候,就會將之前的卸載,重新再添加改變后的元素節(jié)點。因此,上述的問題就出現(xiàn)在,兩棵樹中同一層的節(jié)點類型相同時,在該層添加或刪除時會降低效率或者帶來 bug。

這就是我們在 v-for 循環(huán)中生成同種類型的標簽元素時的情況,如果不為該標簽節(jié)點做點什么,就存在bug隱患,那么應該做什么呢?

答案就是為同一層的相同節(jié)點類型的節(jié)點添加一個唯一標識的 key 值,這樣,在 DOM Diff 進行配對比較時,就會將 key 相同的兩個虛擬 DOM 進行比較,而不是僅僅按照對應位置進行比較了。

這樣一來就不會導致錯位比較了,就大大提高了比較的效率,解決了 bug 隱患。

3. key 不能是 index 下標值

因為數(shù)組或?qū)ο蟮?index 下標值是唯一的,因此我們經(jīng)常使用 index 作為 key 屬性的值,有的人說這樣是可以的,會帶來性能上的優(yōu)化什么的,但使用 index 下標值是會有大大的 bug 隱患的。

這些 bug 會在你 v-for 循環(huán)的數(shù)組或?qū)ο蟀l(fā)生添加或刪除或順序改變時。

那么為什么不能使用 index 下標呢?

其實就是因為 index 下標使用了跟沒使用了一樣,因為在添加和刪除時,某一個特定元素的 index 是會變的,比如 [1,2,3] 變成了 [1,3] 后,原來數(shù)據(jù) 3 對應的下標為2,刪除后數(shù)據(jù) 3 的下標變成了 1,這在 DOM Diff 的時候,會根據(jù) key 值相等的進行兩兩配對比較,這數(shù)據(jù)3對應的節(jié)點前后還是對應不上,因此,使用了 index 作為 key 跟沒設置 key 是一樣的效果。

這就是為什么不要使用 index 作為 key 的原因。

因此:key 屬性值必須是獨一無二的且不會改變的

以上就是詳解vue中v-for的key唯一性的詳細內(nèi)容,更多關于vue中v-for的key唯一性的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩免费看片| 播放一区二区| 99国产精品| 久久午夜精品一区二区| 日韩精品一级二级| 青青国产精品| 国产一区三区在线播放| 日韩欧美一区二区三区在线观看 | av高清不卡| 成人啊v在线| 蜜桃国内精品久久久久软件9| 午夜欧美精品| 日本欧美久久久久免费播放网| 日本精品不卡| 亚洲精品动态| 欧美私人啪啪vps| 国产精品久久久免费| 97精品视频在线看| 国产亚洲精品v| 国产日韩免费| 日本久久成人网| 免费人成黄页网站在线一区二区| 国产剧情一区二区在线观看| 国产在线看片免费视频在线观看| 亚洲激情中文在线| 国产精品久久久久77777丨| 久久精品亚洲| 国产模特精品视频久久久久| 国产日产一区| 欧美日中文字幕| 国产日韩视频| 一区免费视频| 国产一区二区三区四区五区传媒| 欧美午夜不卡| 久久福利在线| 蜜桃视频欧美| 国产欧美日韩亚洲一区二区三区| 精精国产xxxx视频在线野外| 日本欧美在线看| 久久69成人| 国产精品日韩欧美一区| 国产欧美日韩精品一区二区免费| 国产99精品| 精品一级视频| 日韩成人在线看| 久久国产亚洲精品| 免费视频一区二区三区在线观看| 国产美女精品| 精品捆绑调教一区二区三区| 日本欧美在线| 国产麻豆综合| 色婷婷久久久| 精品国产中文字幕第一页| 中文字幕日韩欧美精品高清在线| 日韩欧美一区二区三区免费看| 97精品资源在线观看| 亚洲综合在线电影| 久久精品国产999大香线蕉| 亚洲一区二区三区无吗| 日韩精品久久久久久久电影99爱 | 激情综合网站| 国产一区2区在线观看| 日韩区一区二| 亚洲欧美日韩视频二区| 欧美sss在线视频| 美女av一区| 日韩毛片一区| 亚洲欧美成人综合| 美女网站一区| 成午夜精品一区二区三区软件| 日韩av中文在线观看| 免费在线观看不卡| 亚洲一区国产| 亚洲精品国产偷自在线观看| 免费高潮视频95在线观看网站| 麻豆高清免费国产一区| 国产情侣一区| 国产亚洲精品美女久久久久久久久久| 亚洲婷婷丁香| 水野朝阳av一区二区三区| 激情六月综合| 久久精品免费一区二区三区 | 日本亚洲欧美天堂免费| 久久先锋影音| 久久不射网站| 丝瓜av网站精品一区二区| 在线国产一区| 亚洲男女av一区二区| 欧美日韩国产精品一区二区亚洲| 香蕉精品久久| 亚洲午夜视频| 好看的av在线不卡观看| 久久蜜桃资源一区二区老牛| 亚洲成人精品| 欧美91视频| 在线综合亚洲| 国产视频久久| 乱人伦精品视频在线观看| 国产在线视频欧美一区| 国产一区二区三区久久久久久久久| 麻豆精品少妇| 国产videos久久| 欧美freesex黑人又粗又大| 午夜精品成人av| 免费国产自久久久久三四区久久 | 国产精品av久久久久久麻豆网| 日韩av片子| 久久天堂精品| 99视频在线精品国自产拍免费观看| 亚洲在线一区| 一区二区三区国产盗摄| 欧美日韩亚洲一区三区| 美女在线视频一区| 亚洲综合在线电影| 夜夜嗨一区二区三区| 四虎精品永久免费| 麻豆久久久久久| 国产精品久久久久av电视剧| 99热免费精品| 欧美日韩视频免费看| 动漫av一区| 欧洲在线一区| 伊人www22综合色| 日韩福利在线观看| 91亚洲一区| 红桃视频国产一区| 日本综合视频| 肉色欧美久久久久久久免费看 | 午夜国产精品视频| 天海翼精品一区二区三区| 麻豆精品在线播放| 午夜久久99| 欧美成人精品一级| 99久久婷婷这里只有精品| 午夜久久久久| 欧美亚洲一区二区三区| 日韩电影免费网址| 亚洲欧洲美洲国产香蕉| 国产成人精选| 视频一区二区国产| 国产一区二区三区网| 日韩中文字幕亚洲一区二区va在线 | 亚洲精品视频一二三区| 欧美黄页在线免费观看| 亚洲一级高清| 国产伦乱精品| 亚洲精品中文字幕乱码| 91精品国产自产观看在线| 色天使综合视频| 日韩在线黄色| 久久九九电影| 欧美a一区二区| 亚洲丝袜美腿一区| 成人日韩在线观看| 国产精品夜夜夜| 在线成人直播| 日产精品一区二区| 午夜久久av| 亚洲精品中文字幕乱码| 久久久免费人体| 亚洲精品第一| 亚洲特级毛片| 久久99精品久久久久久园产越南 | 日韩一区二区三区精品| 日韩欧美一区二区三区在线观看| 欧美一级网址| 日韩视频精品在线观看| 韩国一区二区三区视频| 亚洲免费福利一区| 欧美日韩中文一区二区| 精品无人区麻豆乱码久久久 | 免费观看在线综合| 99精品网站| 成人在线视频免费看| 青草久久视频| 亚洲欧洲国产精品一区| 亚洲欧美伊人| 亚洲www啪成人一区二区| 国产精品久久久久久久久久久久久久久 | 欧美日韩国产综合网| 在线看片福利| 精品国产亚洲一区二区三区大结局| 在线观看亚洲精品福利片| 欧美肉体xxxx裸体137大胆| 国产成人调教视频在线观看| 国产欧美综合一区二区三区| 蜜芽一区二区三区| 欧美在线资源| 欧美.日韩.国产.一区.二区| 成人福利视频| 精品美女久久| 精品中文字幕一区二区三区四区| 久久激情综合网| 免费的成人av| 久久高清国产| 天堂成人免费av电影一区| 国产亚洲激情| 亚洲欧美日韩国产一区二区| 一区在线视频观看| 国产精品美女久久久|