這篇文章運用簡單易懂的例子給大家介紹Vue中key有什么作用,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都網(wǎng)站設計、網(wǎng)站建設、外貿(mào)網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元高州做網(wǎng)站,已為上家服務,為高州各地企業(yè)和個人服務,聯(lián)系電話:13518219792
Vue中key的作用
key
的特殊attribute
主要用在Vue
的虛擬DOM
算法,在新舊Nodes
對比時辨識VNodes
。如果不使用key
,Vue
會使用一種最大限度減少動態(tài)元素并且盡可能的嘗試就地修改、復用相同類型元素的算法,而使用key
時,它會基于key
的變化重新排列元素順序,并且會移除key
不存在的元素。此外有相同父元素的子元素必須有獨特的key
,重復的key
會造成渲染錯誤。
描述
首先是官方文檔的描述,當Vue
正在更新使用v-for
渲染的元素列表時,它默認使用就地更新的策略,如果數(shù)據(jù)項的順序被改變,Vue
將不會移動DOM
元素來匹配數(shù)據(jù)項的順序,而是就地更新每個元素,并且確保它們在每個索引位置正確渲染。這個默認的模式是高效的,但是只適用于不依賴子組件狀態(tài)或臨時DOM
狀態(tài)的列表渲染輸出,例如表單輸入值。為了給Vue
一個提示,以便它能跟蹤每個節(jié)點的身份,從而重用和重新排序現(xiàn)有元素,你需要為每項提供一個唯一 key attribute
,建議盡可能在使用v-for
時提供key attribute
,除非遍歷輸出的DOM
內(nèi)容非常簡單,或者是刻意依賴默認行為以獲取性能上的提升。
簡單來說,當在列表循環(huán)中使用key
時,需要使用key
來給每個節(jié)點做一個唯一標識,diff
算法就可以正確的識別此節(jié)點,找到正確的位置直接操作節(jié)點,盡可能地進行重用元素,key
的作用主要是為了高效的更新虛擬DOM
。此外,使用index
作為key
是并不推薦的做法,其只能保證Vue
在數(shù)據(jù)變化時強制更新組件,以避免原地復用帶來的副作用,但不能保證最大限度的元素重用,且使用index
作為key
在數(shù)據(jù)更新方面和不使用key
的效果基本相同。
示例
首先定義一個Vue
實例,渲染四個列表,分別為簡單列表與復雜列表,以及其分別攜帶key
與不攜帶key
時對比其更新渲染時的速度,本次測試使用的是Chrome 81.0
,每次在Console
執(zhí)行代碼時首先會進行刷新重新加載界面,避免瀏覽器以及Vue
自身優(yōu)化帶來的影響。
Vue
簡單列表
在簡單列表的情況下,不使用key
可能會比使用key
的情況下在更新時的渲染速度更快,這也就是官方文檔中提到的,除非遍歷輸出的DOM
內(nèi)容非常簡單,或者是刻意依賴默認行為以獲取性能上的提升。在下面的例子中可以看到?jīng)]有key
的情況下列表更新時渲染速度會快,當不存在key
的情況下,這個列表直接進行原地復用,原有的節(jié)點的位置不變,原地復用元素,將內(nèi)容更新為5
、6
、7
、8
、9
、10
,并添加了11
與12
兩個節(jié)點,而存在key
的情況下,原有的1
、2
、3
、4
節(jié)點被刪除,5
、6
節(jié)點保留,添加了7
、8
、9
、10
、11
、12
六個節(jié)點,由于在DOM
的增刪操作上比較耗時,所以表現(xiàn)為不帶key
的情況下速度更快一些。
// 沒有key的情況下 console.time(); vm.simpleListWithoutKey = [5, 6, 7, 8, 9, 10, 11, 12]; vm.$nextTick(() => console.timeEnd()); // default: 2.193056640625ms
// 存在key的情況下 console.time(); vm.simpleListWithKey = [5, 6, 7, 8, 9, 10, 11, 12]; vm.$nextTick(() => console.timeEnd()); // default: 3.2138671875ms
原地復用可能會帶來一些副作用,文檔中提到原地復用這個默認的模式是高效的,但是只適用于不依賴子組件狀態(tài)或臨時DOM
狀態(tài)的列表渲染輸出,例如表單輸入值。
在不設置key
的情況下,元素中沒有與數(shù)據(jù)data
綁定的部分,Vue
會默認使用已經(jīng)渲染的DOM
,而綁定了數(shù)據(jù)data
的部分會進行跟隨數(shù)據(jù)渲染,假如操作了元素位置,則元素中未綁定data
的部分會停留在原地,而綁定了data
的部分會跟隨操作進行移動,在下面的例子中首先需要將兩個A
之后的輸入框添加數(shù)據(jù)信息,這樣就制作了一個臨時狀態(tài),如果此時點擊下移按鈕,那么不使用key
的組中的輸入框?qū)⒉粫S下移,且B
到了頂端并成為了紅色,而使用key
的組中會將輸入框進行下移,且A
依舊是紅色跟隨下移。
就地復用
采用就地復用策略(vuejs默認情況)
{{p.name}}
不采用就地復用策略(設置key)
{{p.name}}
復雜列表
使用key
不僅能夠避免上述的原地復用的副作用,且在一些操作上可能能夠提高渲染的效率,主要體現(xiàn)在重新排序的情況,包括在中間插入和刪除節(jié)點的操作,在下面的例子中沒有key
的情況下重新排序會原地復用元素,
但是由于v-if
綁定了data
所以會一并進行操作,在這個DOM
操作上比較消耗時間,而使用key
得情況則直接復用元素,v-if
控制的元素在初次渲染就已經(jīng)決定,在本例中沒有對其進行更新,所以不涉及v-if
的DOM
操作,所以在效率上會高一些。
console.time(); vm.complexListWithoutKey = [ {id: 3, list: [7, 8, 9]}, {id: 2, list: [4, 5, 6]}, {id: 1, list: [1, 2, 3]}, ]; vm.$nextTick(() => console.timeEnd()); vm.$nextTick(() => console.timeEnd()); // default: 4.100244140625ms
console.time(); vm.complexListWithKey = [ {id: 3, list: [7, 8, 9]}, {id: 2, list: [4, 5, 6]}, {id: 1, list: [1, 2, 3]}, ]; vm.$nextTick(() => console.timeEnd()); // default: 3.016064453125ms
關于Vue中key有什么作用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。