Vue : construire une application web (école d'ingénieur) · Chapitre 7 · Exercice de TD
Les étapes d'une commande
Communication entre composants · niveau 2
Énoncé
Une commande se passe en trois étapes, trois composants : EtapePanier (bouton « Continuer »), EtapeCoordonnees (un champ « Nom », « Retour », « Continuer » désactivé tant que le nom est vide) et EtapeConfirmation (« Commande au nom de … », « Retour »). Les afficher avec un seul <component :is>, le nom étant conservé par le parent. Le nom saisi est-il perdu quand on revient en arrière ?
Corrigé
<script setup>
import { ref } from "vue";
import EtapeConfirmation from "./EtapeConfirmation.vue";
import EtapeCoordonnees from "./EtapeCoordonnees.vue";
import EtapePanier from "./EtapePanier.vue";
const ETAPES = [
{ titre: "Panier", composant: EtapePanier },
{ titre: "Coordonnées", composant: EtapeCoordonnees },
{ titre: "Confirmation", composant: EtapeConfirmation },
];
const numero = ref(0);
const nom = ref("");
</script>
<template>
<h2>Étape {{ numero + 1 }} sur 3 : {{ ETAPES[numero].titre }}</h2>
<!-- Toutes les étapes ont la même interface : prop nom, événements
update:nom, suivant, precedent -->
<component
:is="ETAPES[numero].composant"
v-model:nom="nom"
@suivant="numero++"
@precedent="numero--"
/>
</template>
<script setup>
const nom = defineModel("nom", { type: String, default: "" });
const emit = defineEmits(["suivant", "precedent"]);
</script>
<script setup>
// Même interface que les autres étapes, même si celle-ci n'utilise pas « nom »
defineProps({ nom: { type: String, default: "" } });
const emit = defineEmits(["update:nom", "suivant", "precedent"]);
</script>
On continue, on tape « Diallo » (avec des espaces), on continue, puis on revient en arrière :
Étape 1 sur 3 : Panier
Étape 2 sur 3 : Coordonnées
Continuer désactivé : true
Étape 3 sur 3 : Confirmation
Commande au nom de Diallo : à confirmer.
Retour
champ après retour : « Diallo »
Le nom n'est pas perdu : il appartient au parent, qui le redonne à l'étape recréée. Les étapes qui n'utilisent pas nom le déclarent quand même, pour que <component :is> puisse leur transmettre les mêmes attributs sans que Vue les ajoute à leur élément racine.
100 % gratuit
La suite du chapitre est sur Adloun
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.