Attribut key de Vue3
keyL'attribut est un attribut spécial crucial de l'algorithme de DOM virtuel de Vue, principalement utilisé pour aider Vue à identifier l'unicité de chaque nœud, ce qui permet de mettre à jour efficacement le DOM virtuel.
Description de base
keyL'attribut est utilisé pour fournir un identifiant unique aux composants ou éléments Vue. Dans le rendu de liste, chaquev-forélément dans la boucle doit avoir un identifiant uniquekeyattribut.
- Type: String | Number
- Objectif: Fournit un identifiant unique pour chaque élément lors du rendu de liste, aidant Vue à comparer efficacement et à réutiliser les nœuds DOM.
Comment ça marche
Lorsque Vue effectue un diff du DOM virtuel, lorsqu'il n'y a pas dekeykey, Vue utilise un algorithme qui minimise les déplacements d'éléments, en réutilisant autant que possible les éléments de même type sur place. Lorsqu'il y akeykey, Vue réorganise les éléments en fonction des changements d'ordre des key et supprime les éléments dont la key n'existe plus.
Les enfants d'un même élément parent doivent avoir des key uniques. Des key en double provoqueront des erreurs de rendu.
Utilisation de base
L'utilisation la plus courante se fait en combinaisonv-foravec v-for :
Exemple
<li v-for="item in items" :key="item.id">
{{ item.name }}
</li>
</ul>
Cas d'utilisation
1. Rendu de liste
Dansv-forL'utilisation de keykeyest le scénario le plus courant :
Exemple
<div>
<div v-for="user in users" :key="user.id" :style="{ marginBottom: '10px' }">
<span>{{ user.id }}</span> -
<span>{{ user.name }}</span> -
<span>{{ user.email }}</span>
</div>
</div>
</template>
<script>
export default {
data() {
return {
users: [
{ id: 1, name: 'Zhang San', email: '[email protected]' },
{ id: 2, name: 'Li Si', email: '[email protected]' },
{ id: 3, name: 'Wang Wu', email: '[email protected]' }
]
}
}
}
</script>
2. Forcer le remplacement des éléments
keyCela peut également être utilisé pour forcer le remplacement d'éléments ou de composants au lieu de les réutiliser. Cela est utile dans les scénarios suivants :
- Déclencher correctement les hooks du cycle de vie des composants
- Déclencher des animations de transition
Exemple
<div>
<input v-model="text" placeholder=Lorsque le contenu de l'entrée />
<transition>
<span :key="text">{{ text }}</span>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
text: ''
}
}
}
</script>
Quandtextmodifications,<span>l'élément est remplacé au lieu d'être réutilisé, ce qui déclenche l'effet de transition.
Notes
key doit être unique et stable: la valeur de key ne doit pas changer lorsque les données changent, sinon cela affectera les performances de Vue et la stratégie de réutilisation du DOM virtuel.
Évitez d'utiliser l'index comme clé: sauf si vous savez explicitement que l'ordre des éléments de la liste ne changera pas. Parce que l'index est basé sur la position, lorsque l'ordre de la liste change, la clé change aussi, ce qui empêche Vue de réutiliser correctement les nœuds DOM.
Exemple
<li v-for="(item, index) in items" :key="index">{{ item.name }}</li>
<!-- Recommandé : utiliser un ID unique comme clé -->
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
Utilisation avec v-for
keyetv-forLorsqu'ils sont utilisés ensemble, il existe plusieurs syntaxes :
Exemple
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
<!-- Itération avec index -->
<li v-for="(item, index) in items" :key="index">{{ index }} - {{ item.name }}</li>
<!-- Itération d'objet -->
<li v-for="(value, key, index) in object" :key="key">
{{ index }}. {{ key }}: {{ value }}
</li>
<!-- Itération sur les nombres -->
<span v-for="n in 5" :key="n">{{ n }}</span>
Autres extensions
Attributs intégrés de Vue3