Guide
Essentiel
- Installation
- Introduction
- Instance de Vue
- Syntaxe de template
- Propriétés calculées et observateurs
- Liaisons de classes et de styles
- Rendu conditionnel
- Rendu de liste
- Gestion des évènements
- Liaisons sur les champs de formulaire
- Composants
Composants en détail
- Création de composants
- Props
- Évènements personnalisés
- Slots
- Composants dynamiques et asynchrones
- Gérer les cas limites
Transitions & animation
- Transitions d'entrée, de sortie et de liste
- Transitions d'état
Réutilisabilité & composition
- Mixins
- Directives personnalisées
- Fonctions de rendu et JSX
- Plugins
- Filtres
Outils
- Composants monofichiers
- Testing
- Support de TypeScript
- Déploiement en production
Évolutions
- Routage
- Gestion de l'état
- Rendu côté serveur
- Security
Mécanismes
- Réactivité en détail
Migration
- Migration depuis Vue 1.x
- Migration depuis Vue Router 0.7.x
- Migration depuis Vuex 0.6.x à 1.0
Meta
- Comparaison avec les autres frameworks
- Rejoignez la communauté Vue.js !
- Rencontrer l'équipe
You’re browsing the documentation for v2.x and earlier. For v3.x, click here.
Rendu de liste
Associer un tableau à des éléments avec v-for
Nous pouvons utiliser la directive v-for
pour faire le rendu d’une liste d’éléments en nous basant sur un tableau. La directive v-for
utilise une syntaxe spécifique de la forme item in items
, où items
représente le tableau source des données et où item
est un alias représentant l’élément du tableau en cours d’itération :
|
|
Résultat :
- {{item.message}}
À l’intérieur des structures v-for
, nous avons un accès complet aux propriétés de la portée parente. v-for
supporte également un second argument optionnel représentant l’index de l’élément courant.
|
|
Résultat :
- {{ parentMessage }} - {{ index }} - {{ item.message }}
Vous pouvez également utiliser of
en tant que mot-clé à la place de in
pour être plus proche de la syntaxe JavaScript concernant l’utilisation des itérateurs :
|
v-for
avec l’objet
Vous pouvez aussi utiliser v-for
pour itérer sur les propriétés d’un objet.
|
|
Résultat :
- {{ value }}
Vous pouvez également fournir un deuxième argument représentant le nom de la propriété courante (c.-à-d. la clé) :
|
Et un autre pour l’index :
|
Quand vous itérez sur un objet, l’ordre est basé sur l’ordre d’énumération de Object.keys()
et il n’y a aucune garantie de cohérence à travers toutes les implémentations des moteurs JavaScript.
Maintien d’état
Quand Vue met à jour une liste d’éléments rendus avec v-for
, il utilise par défaut une stratégie de « modification localisée » (in-place patch). Si l’ordre des éléments d’un tableau dans data
a changé, plutôt que de déplacer les éléments du DOM pour concorder avec le nouvel ordre des éléments, Vue va simplement modifier chaque élément déjà en place et s’assurer que cela reflète ce qui aurait dû être rendu à cet index en particulier. C’est un comportement similaire au track-by="$index"
de Vue 1.x.
Ce mode par défaut est performant, mais adapté seulement lorsque le résultat du rendu de votre liste ne dépend pas de l’état d’un composant enfant ou de l’état temporaire du DOM (par ex. : les valeurs de champs d’un formulaire).
Pour expliquer à Vue comment suivre l’identité de chaque nœud, afin que les éléments existants puissent être réutilisés et réordonnés, vous devez fournir un attribut unique key
pour chaque élément :
|
Il est recommandé de fournir une key
avec v-for
chaque fois que possible, à moins que le contenu itéré du DOM soit simple ou que vous utilisiez intentionnellement le comportement de base pour un gain de performance.
Comme c’est un mécanisme générique pour Vue permettant d’identifier les nœuds, la key
a également d’autres usages et ne se limite pas seulement à son utilisation avec v-for
, comme nous le verrons plus tard dans le guide.
N’utilisez pas des valeurs non primitive comme des objets ou des tableaux comme clés pour v-for
. Utilisez des chaines de caractères ou des nombres à la place.
Pour une utilisation détaillée de l’attribut key
, consultez la documentation d’API key
.
Détection de changement dans un tableau
Méthodes de mutation
Vue surcharge les méthodes de mutation d’un tableau observé afin qu’elles déclenchent également des mises à jour de la vue. Les méthodes encapsulées sont :
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
Vous pouvez ouvrir la console et jouer avec la liste des éléments items
des exemples précédents en appelant leurs méthodes de mutation. Par exemple : example1.items.push({ message: 'Baz' })
.
Remplacer un tableau
Les méthodes de mutation, comme leur nom le suggère, modifient le tableau d’origine sur lequel elles sont appelées. En comparaison, il y a aussi des méthodes non-mutatives comme par ex. filter()
, concat()
et slice()
, qui ne changent pas le tableau original mais retourne toujours un nouveau tableau. Quand vous travaillez avec des méthodes non-mutatives, vous pouvez juste remplacer l’ancien tableau par le nouveau :
|
Vous pouvez penser que cela va forcer Vue à jeter le DOM existant et à faire de nouveau le rendu de la liste entière ? Par chance, cela n’est pas le cas. Vue implémente plusieurs fonctions heuristiques intelligentes pour maximiser la réutilisation du DOM existant ; ainsi remplacer un tableau par un autre contenant des objets différents à certains index est une opération très performante.
Limitations
En raison des limitations de JavaScript, il y a des types de changements que Vue ne peut pas détecter avec les tableaux et les objets. Ils sont abordés dans la section réactivité.
Affichage de résultats filtrés/triés
Parfois nous voulons afficher une version filtrée ou triée d’un tableau sans pour autant modifier ou réassigner les données d’origine. Dans ce cas, vous pouvez créer une propriété calculée qui retourne le tableau filtré ou trié.
Par exemple :
|
|
Dans les situations où les propriétés calculées ne sont pas utilisables (par ex. à l’intérieur d’une boucle v-for
imbriquée), vous pouvez juste utiliser une méthode :
|
|
v-for
et plage de valeurs
v-for
peut également prendre un nombre entier. Dans ce cas, il répètera le template autant de fois qu’indiqué.
|
Résultat :
Template v-for
De la même manière qu’avec v-if
, vous pouvez également utiliser la balise <template>
avec v-for
pour faire le rendu d’une structure contenant de multiples éléments. Par exemple :
|
v-for
avec v-if
Notez qu’il n’est pas recommandé d’utiliser v-if
et v-for
ensemble. Référez-vous aux Conventions pour plus de détails.
Quand ils existent sur le même nœud, v-for
a une priorité plus élevée que v-if
. Cela signifie que v-if
va être exécuté indépendamment à chaque itération de boucle. C’est très utile quand vous voulez faire le rendu de seulement certains noeuds, comme ci-dessous :
|
La partie ci-dessus fait uniquement le rendu des tâches qui ne sont pas achevées.
Si votre intention est plutôt de sauter conditionnellement l’exécution de la boucle, vous pouvez placer le v-if
sur l’élément parent (ou sur <template>
). Par exemple :
|
Composants et v-for
Cette partie suppose que vous connaissez les Composants. Vous pouvez la passer pour le moment et y revenir plus tard.
Vous pouvez directement utiliser v-for
sur un composant personnalisé, comme sur n’importe quel autre élément standard :
|
En 2.2.0+, lors de l’utilisation de
v-for
avec un composant, unekey
(clé) est maintenant requise.
Cependant, cela ne passera pas automatiquement les données au composant parce que les composants ont leurs propres portées isolées. Pour passer les données itérées au composant, nous devons utiliser les props en plus :
|
La raison pour ne pas injecter automatiquement item
dans le composant est que cela le rendrait fortement couplé au fonctionnement de v-for
. Être explicite sur l’endroit d’où proviennent les données rend le composant réutilisable dans d’autres situations.
Voici un exemple complet d’une simple liste de tâches :
|
Notez l’attribut is="todo-item"
. Il est nécessaire dans le template du DOM, car seuls les éléments <li>
sont valides à l’intérieur des <ul>
. Cela fait la même chose que <todo-item>
, mais permet de contourner les erreurs potentielles d’analyse des navigateurs. Consultez les limitations de l’analyse d’un template à partir du DOM pour en savoir plus.
|