# Atributo key
breaking
# Visão Geral
- NOVO:
key
s não são mais necessárias em branchesv-if
/v-else
/v-else-if
, já que o Vue agora gera automaticamentekey
s únicas.- BREAKING: Se você informar
key
s manualmente, então cada branch deve ter umakey
única. Você não pode mais usar intencionalmente a mesmakey
para forçar reuso de branch.
- BREAKING: Se você informar
- BREAKING:
key
s de<template v-for>
devem ser colocadas na tag<template>
(ao invés de em seus filhos).
# Background
O atributo especial key
é usado como uma dica para o algoritmo de DOM virtual do Vue rastrear a identidade de um nó. Dessa forma, o Vue sabe quando pode reutilizar e corrigir nós existentes e quando precisa reordená-los ou recriá-los. Para mais informações, olhe as seções a seguir:
# Em Branches Condicionais
No Vue 2.x, era recomendado o uso de key
s nos branches v-if
/v-else
/v-else-if
.
<!-- Vue 2.x -->
<div v-if="condition" key="yes">Sim</div>
<div v-else key="no">Não</div>
2
3
O exemplo acima ainda funciona no Vue 3.x. Porém, não é mais recomendado o uso do atributo key
em branches v-if
/v-else
/v-else-if
, já que key
s únicas são geradas automaticamente em branches condicionais caso você não as informe.
<!-- Vue 3.x -->
<div v-if="condition">Sim</div>
<div v-else>Não</div>
2
3
A grande mudança (breaking change) é que se você informar key
s manualmente, cada branch deverá usar uma key
única. Na maioria dos casos, você pode remover essas key
s.
<!-- Vue 2.x -->
<div v-if="condition" key="a">Sim</div>
<div v-else key="a">Não</div>
<!-- Vue 3.x (solução recomendada: remover as keys) -->
<div v-if="condition">Sim</div>
<div v-else>Não</div>
<!-- Vue 3.x (solução alternativa: garantir que as keys sejam sempre únicas) -->
<div v-if="condition" key="a">Sim</div>
<div v-else key="b">Não</div>
2
3
4
5
6
7
8
9
10
11
# Com <template v-for>
No Vue 2.x, uma tag <template>
não poderia ter uma key
. Em vez disso, você poderia colocar as key
s em cada uma de suas tags filhas.
<!-- Vue 2.x -->
<template v-for="item in list">
<div :key="'heading-' + item.id">...</div>
<span :key="'content-' + item.id">...</span>
</template>
2
3
4
5
No Vue 3.x, a key
deve ser colocada na tag <template>
.
<!-- Vue 3.x -->
<template v-for="item in list" :key="item.id">
<div>...</div>
<span>...</span>
</template>
2
3
4
5
Similarmente, quando houver uma tag <template v-for>
com uma tag filha que use v-if
, a key
deve ser movida para a tag <template>
.
<!-- Vue 2.x -->
<template v-for="item in list">
<div v-if="item.isVisible" :key="item.id">...</div>
<span v-else :key="item.id">...</span>
</template>
<!-- Vue 3.x -->
<template v-for="item in list" :key="item.id">
<div v-if="item.isVisible">...</div>
<span v-else>...</span>
</template>
2
3
4
5
6
7
8
9
10
11