創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)專注于企業(yè)營銷型網站建設、網站重做改版、達茂旗網站定制設計、自適應品牌網站建設、HTML5建站、成都做商城網站、集團公司官網建設、外貿營銷網站建設、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為達茂旗等各大城市提供網站開發(fā)制作服務。這篇文章運用簡單易懂的例子給大家介紹Vue中key有什么作用,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Vue中key的作用
key
的特殊attribute
主要用在Vue
的虛擬DOM
算法,在新舊Nodes
對比時辨識VNodes
。如果不使用key
,Vue
會使用一種大限度減少動態(tài)元素并且盡可能的嘗試就地修改、復用相同類型元素的算法,而使用key
時,它會基于key
的變化重新排列元素順序,并且會移除key
不存在的元素。此外有相同父元素的子元素必須有獨特的key
,重復的key
會造成渲染錯誤。
描述
首先是官方文檔的描述,當Vue
正在更新使用v-for
渲染的元素列表時,它默認使用就地更新的策略,如果數據項的順序被改變,Vue
將不會移動DOM
元素來匹配數據項的順序,而是就地更新每個元素,并且確保它們在每個索引位置正確渲染。這個默認的模式是高效的,但是只適用于不依賴子組件狀態(tài)或臨時DOM
狀態(tài)的列表渲染輸出,例如表單輸入值。為了給Vue
一個提示,以便它能跟蹤每個節(jié)點的身份,從而重用和重新排序現(xiàn)有元素,你需要為每項提供一個唯一 key attribute
,建議盡可能在使用v-for
時提供key attribute
,除非遍歷輸出的DOM
內容非常簡單,或者是刻意依賴默認行為以獲取性能上的提升。
簡單來說,當在列表循環(huán)中使用key
時,需要使用key
來給每個節(jié)點做一個唯一標識,diff
算法就可以正確的識別此節(jié)點,找到正確的位置直接操作節(jié)點,盡可能地進行重用元素,key
的作用主要是為了高效的更新虛擬DOM
。此外,使用index
作為key
是并不推薦的做法,其只能保證Vue
在數據變化時強制更新組件,以避免原地復用帶來的副作用,但不能保證大限度的元素重用,且使用index
作為key
在數據更新方面和不使用key
的效果基本相同。
示例
首先定義一個Vue
實例,渲染四個列表,分別為簡單列表與復雜列表,以及其分別攜帶key
與不攜帶key
時對比其更新渲染時的速度,本次測試使用的是Chrome 81.0
,每次在Console
執(zhí)行代碼時首先會進行刷新重新加載界面,避免瀏覽器以及Vue
自身優(yōu)化帶來的影響。
Vue
簡單列表
在簡單列表的情況下,不使用key
可能會比使用key
的情況下在更新時的渲染速度更快,這也就是官方文檔中提到的,除非遍歷輸出的DOM
內容非常簡單,或者是刻意依賴默認行為以獲取性能上的提升。在下面的例子中可以看到沒有key
的情況下列表更新時渲染速度會快,當不存在key
的情況下,這個列表直接進行原地復用,原有的節(jié)點的位置不變,原地復用元素,將內容更新為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
的情況下,元素中沒有與數據data
綁定的部分,Vue
會默認使用已經渲染的DOM
,而綁定了數據data
的部分會進行跟隨數據渲染,假如操作了元素位置,則元素中未綁定data
的部分會停留在原地,而綁定了data
的部分會跟隨操作進行移動,在下面的例子中首先需要將兩個A
之后的輸入框添加數據信息,這樣就制作了一個臨時狀態(tài),如果此時點擊下移按鈕,那么不使用key
的組中的輸入框將不會跟隨下移,且B
到了頂端并成為了紅色,而使用key
的組中會將輸入框進行下移,且A
依舊是紅色跟隨下移。
就地復用
采用就地復用策略(vuejs默認情況)
{{p.name}}
不采用就地復用策略(設置key)
{{p.name}}
復雜列表
使用key
不僅能夠避免上述的原地復用的副作用,且在一些操作上可能能夠提高渲染的效率,主要體現(xiàn)在重新排序的情況,包括在中間插入和刪除節(jié)點的操作,在下面的例子中沒有key
的情況下重新排序會原地復用元素,
但是由于v-if
綁定了data
所以會一并進行操作,在這個DOM
操作上比較消耗時間,而使用key
得情況則直接復用元素,v-if
控制的元素在初次渲染就已經決定,在本例中沒有對其進行更新,所以不涉及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有什么作用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。