Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →