Capitolo 4 di 11

Tutorial Vue 3: rendering di liste con v-for e :key

verificato il 2 Settembre 2026 · 3 min

Risposta rapida

v-for="item in items" ripete un elemento per ogni voce di un array. Aggiungi sempre un :key unico e stabile, ricavato dai tuoi dati e non dall'indice, così Vue tiene traccia correttamente di ogni elemento a ogni aggiornamento.

Alla fine di questo capitolo, saprai mostrare una lista a partire da un array e scegliere una chiave corretta.

Una scheda prodotto è piena di liste: la composizione del tessuto, le varianti di colore, le recensioni. La direttiva v-for ripete un elemento del template per ogni voce di un array.

Ciclare su un array semplice

Aggiungi allo stato la composizione del prodotto:

src/App.vue
<script setup>
import { ref } from 'vue'

const product = ref('T-Shirt')
const image = ref('/images/t-shirt-bleu.svg')
const inventory = ref(100)
const details = ref(['60 % coton', '30 % laine', '10 % polyester'])
</script>

Poi mostrala:

src/App.vue
<ul>
  <li v-for="detail in details" :key="detail">{{ detail }}</li>
</ul>

Vue produce un <li> per ogni voce. Nell’espressione detail in details, details è l’array e detail l’alias dell’elemento corrente, disponibile ovunque dentro l’elemento ripetuto.

Ciclare su oggetti

Le varianti del prodotto sono oggetti, con un identificatore e un colore:

src/App.vue
<script setup>
const variants = ref([
  { id: 2234, color: 'Bleu' },
  { id: 2235, color: 'Rouge' }
])
</script>

Alle proprietà si accede con la notazione a punto:

src/App.vue
<div v-for="variant in variants" :key="variant.id">{{ variant.color }}</div>

L’indice

Un secondo parametro dà la posizione nell’array, a partire da zero:

html
<li v-for="(detail, index) in details" :key="detail">
  {{ index + 1 }}. {{ detail }}
</li>

Il capitolo 7 userà questo indice per sapere su quale variante si trova il cursore.

L’attributo key

Avrai notato il :key su ogni ciclo. È la scorciatoia di v-bind:key vista al capitolo 2, e non è lì per decorazione.

Quando la lista cambia, Vue confronta la vecchia e la nuova versione per modificare solo il necessario. Senza un identificatore stabile, accoppia gli elementi per posizione: se inserisci una voce in cima alla lista, considera che tutti gli elementi hanno cambiato contenuto e li riscrive uno per uno.

Con una key unica e stabile riconosce ogni elemento e si limita a spostare quello che si è mosso. Questo evita anche un bug classico: un campo di testo o una casella spuntata che resta agganciata all’elemento sbagliato dopo un ordinamento.

Tre regole per la chiave:

  • Unica nella lista.
  • Stabile: la stessa voce mantiene la stessa chiave da un rendering all’altro.
  • Mai l’indice, a meno che la lista non cambi mai. L’indice si sposta a ogni inserimento, eliminazione o ordinamento: ed è proprio lì che non ci si può fidare.

Usa l’identificatore dei tuoi dati. Qui, variant.id per le varianti, e la stringa stessa per i dettagli, visto che sono uniche.

Non mettere v-if e v-for sullo stesso tag

Da Vue 3, v-if viene valutata prima di v-for. La variabile del ciclo quindi non esiste ancora e Vue solleva un errore del tipo variant is not defined. Filtra la lista in una proprietà calcolata, oppure sposta il ciclo su un <template> interno.

html
<!-- ne fonctionne pas -->
<div v-for="variant in variants" v-if="variant.enStock">…</div>

<!-- fonctionne -->
<template v-for="variant in variants" :key="variant.id">
  <div v-if="variant.enStock">…</div>
</template>

Ciclare su qualcosa che non è un array

v-for accetta anche un oggetto, una stringa o un numero intero:

html
<!-- objet : valeur, clé, index -->
<li v-for="(valeur, cle) in produit" :key="cle">{{ cle }} : {{ valeur }}</li>

<!-- nombre : de 1 à 5, pas de 0 à 4 -->
<span v-for="n in 5" :key="n">{{ n }}</span>
Con la Options API

Nel template non cambia niente. Cambia solo la dichiarazione dell’array: data() { return { details: [...] } } al posto di const details = ref([...]).

EsercizioMostra la lista dei dettagli con il loro numero d'ordine, usando il secondo parametro di v-for. Poi aggiungi una terza variante di colore all'array e verifica che compaia senza nessun'altra modifica.

Errori frequenti

Usare l'indice come chiave L'indice cambia a ogni inserimento, eliminazione e ordinamento: Vue accoppia allora gli elementi sbagliati, e il contenuto dei campi di testo finisce sulla riga sbagliata. Usa un identificatore che arriva dai dati.
Dimenticare :key Vue avvisa nella console e ripiega sulla posizione, il che produce rendering inutili e bug di stato.
Combinare v-if e v-for Vietato sullo stesso tag da Vue 3: v-if viene valutata per prima e non vede la variabile del ciclo.
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.