# Atributo key
breaking
# Visão Geral
- NOVO:
keys não são mais necessárias em branchesv-if/v-else/v-else-if, já que o Vue agora gera automaticamentekeys únicas.- BREAKING: Se você informar
keys manualmente, então cada branch deve ter umakeyúnica. Você não pode mais usar intencionalmente a mesmakeypara forçar reuso de branch.
- BREAKING: Se você informar
- BREAKING:
keys 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 keys 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 keys ú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 keys manualmente, cada branch deverá usar uma key única. Na maioria dos casos, você pode remover essas keys.
<!-- 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 keys 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