Atributo key de Vue3
keyEl atributo key es un atributo especial clave en el algoritmo del DOM virtual de Vue, utilizado principalmente para ayudar a Vue a identificar la unicidad de cada nodo y así actualizar el DOM virtual de manera eficiente.
Descripción básica
keyEl atributo key se utiliza para proporcionar una identificación única a los componentes o elementos de Vue. En el renderizado de listas, cadav-forelemento del bucle debe tener unkeyatributo único.
- Tipo: String | Number
- Función: proporciona una identificación única para cada elemento en el renderizado de listas, ayudando a Vue a hacer diff y reutilizar nodos DOM de manera eficiente.
Principio de funcionamiento
Cuando Vue realiza el diff del DOM virtual, si no haykeykey, Vue adopta un algoritmo que minimiza el movimiento de elementos, reutilizando en el lugar elementos del mismo tipo siempre que sea posible. Conkeykey, Vue reordena los elementos según los cambios de orden de las key y elimina aquellos cuyas key ya no existen.
Los elementos hijos del mismo elemento padre deben tener key únicas. Las key duplicadas pueden causar errores de renderizado.
Uso básico
El uso más común es combinarlo conv-forv-for:
Ejemplo
<li v-for="item in items" :key="item.id">
{{ item.name }}
</li>
</ul>
Casos de uso
1. Renderizado de listas
Env-forEl uso de key enkeyel renderizado de listas es el caso más común:
Ejemplo
<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. Forzar el reemplazo de elementos
keyTambién se puede utilizar para forzar el reemplazo de un elemento o componente, en lugar de reutilizarlo. Esto es útil en los siguientes escenarios:
- Activar correctamente los hooks del ciclo de vida del componente
- Activar animaciones de transición
Ejemplo
<div>
<input v-model="text" placeholder="Contenido de entrada" />
<transition>
<span :key="text">{{ text }}</span>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
text: ''
}
}
}
</script>
Cuandotextcuando cambia,<span>el elemento se reemplaza en lugar de reutilizarse, por lo que se activa el efecto de transición.
Notas
La key debe ser única y estable: el valor de la key no debe cambiar con los cambios de los datos; de lo contrario, afectará el rendimiento de Vue y la estrategia de reutilización del DOM virtual.
Evita usar el índice como key: a menos que sepas claramente que el orden de los elementos de la lista no cambiará. Como el índice se basa en la posición, cuando el orden de la lista cambia, la key también cambia, lo que provoca que Vue no pueda reutilizar correctamente los nodos DOM.
Ejemplo
<li v-for="(item, index) in items" :key="index">{{ item.name }}</li>
<!-- Recomendado: usar un ID único como key -->
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
Uso con v-for
keyyv-forAl usarlo con v-for, existen las siguientes sintaxis:
Ejemplo
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
<!-- Recorrido con índice -->
<li v-for="(item, index) in items" :key="index">{{ index }} - {{ item.name }}</li>
<!-- Recorrido de objeto -->
<li v-for="(value, key, index) in object" :key="key">
{{ index }}. {{ key }}: {{ value }}
</li>
<!-- Recorrido de números -->
<span v-for="n in 5" :key="n">{{ n }}</span>
Otras extensiones
Atributos integrados de Vue3