Adloun

Vue : construire une application web (école d'ingénieur) · Chapitre 7 · Application directe du cours

Un format de prix fourni

Communication entre composants · niveau 2

Énoncé

Un composant PrixLivre affiche un prix. La façon de le formater (devise, langue) doit être fournie par un ancêtre : l'application fournit un format en euros, une zone ZoneSuisse un format en francs suisses pour ses descendants. Sans fournisseur, le prix s'affiche « 8.5 € ». Écrire les trois composants.

Corrigé


export const cleFormatPrix = Symbol("formatPrix");

<script setup>
import { inject } from "vue";
import { cleFormatPrix } from "./cles.js";

defineProps({ prix: { type: Number, required: true } });

// Valeur par défaut : un format simple, si aucun ancêtre n'en fournit
const formater = inject(cleFormatPrix, (prix) => `${prix} €`);
</script>

<template>
  <strong>{{ formater(prix) }}</strong>
</template>

<script setup>
import { provide } from "vue";
import { cleFormatPrix } from "./cles.js";

const format = new Intl.NumberFormat("fr-CH", { style: "currency", currency: "CHF" });
provide(cleFormatPrix, (prix) => format.format(prix));
</script>

<template>
  <slot />
</template>

<script setup>
import { provide } from "vue";
import PrixLivre from "./PrixLivre.vue";
import ZoneSuisse from "./ZoneSuisse.vue";
import { cleFormatPrix } from "./cles.js";

const format = new Intl.NumberFormat("fr-FR", { style: "currency", currency: "EUR" });
provide(cleFormatPrix, (prix) => format.format(prix));
</script>

<template>
  <p>France : <PrixLivre :prix="8.5" /></p>
  <ZoneSuisse>
    <p>Suisse : <PrixLivre :prix="8.5" /></p>
  </ZoneSuisse>
</template>

France : 8,50 €
Suisse : 8.50 CHF

Le fournisseur le plus proche l'emporte : dans la zone suisse, c'est son format qui est injecté, et non celui de l'application. Ici, on fournit une fonction : elle ne change pas, une valeur ordinaire suffit.

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 →