一、基礎知識
在 Vue.js 中,當使用 v-for 來渲染列表數據時,Vue.js 需要為每個列表項分配一個唯一的標識符,以便於檢測出數據項的變化,進而高效地渲染到真實的 DOM 中。這個唯一標識符就稱為 key。
當 key 發生變化時,Vue.js 會給 DOM 元素添加/移除、更新子組件。如果沒有正確使用 key,就有可能導致出錯。
當我們使用 v-bind 綁定一個值時,我們可以使用 v-bind:key=”keyName” 這種方式來指導 Vue.js 哪些元素是需要被更新的。
二、key的使用
在使用 v-for 渲染列表時,我們需要給每個列表項設置一個唯一的 key 值,以方便 Vue.js 執行高效的 DOM 更新。
下面是一個簡單的示例代碼,展示如何使用 key。
<ul>
<li v-for="item in items" v-bind:key="item.id">
{{ item.text }}
</li>
</ul>
上述代碼中,使用 v-for 循環渲染 items 數組中的每條數據,為每個循環項綁定了一個唯一的 key 值,這個唯一的 key 值是每條數據中的 id 屬性。
三、key的原理
當 Vue.js 渲染一個新的列表時,會創建一個數據的副本,用於記錄每個列表項所對應的 DOM 元素。當數據發生變化時,Vue.js 會先對比兩個數據副本,找出發生變化的列表項或其它 DOM 元素,然後通過 diff 演算法來更新這些變化的元素。
在這個過程中,Vue.js 會使用 key 值來判斷哪些元素需要被更新,以及它們的更新方式。首先,Vue.js 會根據每個元素的 key 值,嘗試去尋找對應的 DOM 元素。如果找到了,則說明這個元素只需要被更新。如果找不到,則說明這個元素要麼被添加,要麼被刪除,要麼是其它的替換邏輯。
因為 Vue.js 在遍歷列表 items 時會生成一個虛擬 DOM 樹(VNode樹),所以如果不使用 key,Vue.js 得不到兩次遍歷之間某個元素的確定的關係,會瘋狂的重新創建和銷毀 DOM 節點,導致性能問題。
四、使用key的注意事項
1、key 值必須是 string 或者 number 類型的,其他類型會被強制轉換成字元串類型。這也意味著,如果你使用對象或者數組作為 key 值,那麼它們會被隱式地調用 toString() 方法最終轉化成字元串類型,所以請確保 key 值能夠唯一、確定、穩定地標識每個列表項。
2、在相同的列表中,不同的列表項所用的 key 值必須是唯一的。如果重複使用相同的 key 值,Vue.js 會發出警告,並且只有最後一個列表項生效。
3、不要在用 v-for 渲染的組件裡面使用 v-once,因為它只會渲染一次。這也會破壞 Vue.js 在 DOM 更新時對每個元素的 key 值做的判斷和標記,造成錯誤的 DOM 展示。
4、不要將 v-for 屬性和 v-if 屬性用在同一個元素上。如果必須同時使用 v-for 和 v-if,需要將 v-if 放置在外圍的容器元素上。
五、示例代碼
在組件中使用 key:
<template>
<div>
<ul>
<li
v-for="(item, index) in items"
v-bind:key="item.id"
v-bind:class="{ active: selectedIndex === index }"
>
{{ item.text }}
</li>
</ul>
</div>
</template>
在 DOM 元素中使用 key:
<a
v-for="item in items"
v-bind:key="item.id"
v-bind:href="'/detail/' + item.id"
>
{{ item.text }}
</a>
六、總結
使用 v-bind:key 可以讓 Vue.js 在渲染列表時更高效、更精準地更新 DOM 元素,這對於提升列表渲染的性能和用戶體驗非常重要。在使用 key 時,需要注意一些細節,比如 key 值的類型和唯一性、不要和 v-if 一起使用等。只有理解和正確使用了 key,才能讓 Vue.js 渲染列表時更有效率、更準確。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/241799.html