Chapitre 4 sur 11

Tutoriel VueJS 3 – Rendu de liste

vérifié le 2 septembre 2026 · 3 min

Réponse rapide

v-for="item in items" répète un élément pour chaque entrée d’un tableau. Ajoutez toujours un :key unique et stable, tiré de vos données et non de l’index, pour que Vue suive correctement chaque élément lors des mises à jour.

À la fin de ce chapitre, vous saurez afficher une liste depuis un tableau et choisir une clé correcte.

Une fiche produit affiche des listes : la composition du tissu, les déclinaisons de couleur, les avis. La directive v-for répète un élément du gabarit pour chaque entrée d’un tableau.

Boucler sur un tableau simple

Ajoutez la composition du produit à l’état :

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>

Puis affichez-la :

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

Vue produit un <li> par entrée. Dans l’expression detail in details, details est le tableau et detail l’alias de l’élément courant, disponible partout dans l’élément répété.

Boucler sur des objets

Les déclinaisons du produit sont des objets, avec un identifiant et une couleur :

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

On accède aux propriétés par la notation pointée :

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

L’index

Un second paramètre donne la position dans le tableau, à partir de zéro :

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

Le chapitre 7 se servira de cet index pour savoir quelle déclinaison est survolée.

L’attribut key

Vous avez remarqué le :key sur chaque boucle. C’est le raccourci de v-bind:key vu au chapitre 2, et il n’est pas décoratif.

Quand la liste change, Vue compare l’ancienne et la nouvelle version pour ne modifier que le nécessaire. Sans identifiant stable, il apparie les éléments par position : si vous insérez une entrée en tête de liste, il considère que tous les éléments ont changé de contenu et les réécrit tous.

Avec une key unique et stable, il reconnaît chaque élément et se contente de déplacer ce qui a bougé. Cela évite aussi un bug classique : un champ de saisie ou une case cochée qui reste attaché au mauvais élément après un tri.

Trois règles pour la clé :

  • Unique dans la liste.
  • Stable : la même entrée garde la même clé d’un rendu à l’autre.
  • Pas l’index, sauf si la liste ne bouge jamais. L’index change quand on insère, supprime ou trie : c’est précisément là qu’il ne faut pas s’y fier.

Utilisez l’identifiant de vos données. Ici, variant.id pour les déclinaisons, et la chaîne elle-même pour les détails puisqu’elles sont uniques.

Ne mettez pas v-if et v-for sur la même balise

Depuis Vue 3, v-if s’évalue avant v-for. La variable de boucle n’existe donc pas encore et Vue lève une erreur du type variant is not defined. Filtrez la liste dans une propriété calculée, ou déplacez la boucle sur un <template> intérieur.

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>

Boucler sur autre chose qu’un tableau

v-for accepte aussi un objet, une chaîne, ou un nombre entier :

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>
En Options API

Identique dans le gabarit. Seule la déclaration du tableau change : data() { return { details: [...] } } au lieu de const details = ref([...]).

ExerciceAffichez la liste des détails avec leur numéro d’ordre, en utilisant le second paramètre de v-for. Puis ajoutez une troisième déclinaison de couleur au tableau et vérifiez qu’elle apparaît sans autre modification.

Erreurs fréquentes

Utiliser l’index comme clé L’index change à l’insertion, à la suppression et au tri : Vue apparie alors les mauvais éléments, ce qui déplace le contenu des champs de saisie. Utilisez un identifiant issu des données.
Oublier :key Vue avertit dans la console et se rabat sur la position, ce qui provoque des rendus inutiles et des bugs d’état.
Combiner v-if et v-for Interdit sur la même balise depuis Vue 3 : v-if s’évalue en premier et ne voit pas la variable de boucle.
Newsletter

Les nouveaux tests, tutoriels et projets, par e-mail.

Tests reproductibles, code versionné, résultats datés. Jamais de spam.