Vue : construire une application web (école d'ingénieur) · Chapitre 6 · Application directe du cours
Convertir un composant
Vite et composants monofichiers · niveau 1 (application)
Énoncé
Réécrire en composant monofichier une carte de livre simplifiée : elle reçoit un livre (titre, prix, stock), affiche son titre et son prix en euros, et un bouton « Ajouter au panier » (« Épuisé », désactivé, si le stock est nul) qui émet ajouter avec le livre. Le prix est en couleur ocre et en gras, sans que ce style touche le reste de la page. L'utiliser pour deux livres, dont un épuisé.
Corrigé
<script setup>
defineProps({
livre: { type: Object, required: true },
});
const emit = defineEmits(["ajouter"]);
function euros(montant) {
return montant.toLocaleString("fr-FR", { style: "currency", currency: "EUR" });
}
</script>
<template>
<article class="carte">
<h2>{{ livre.titre }}</h2>
<p class="prix">
{{ euros(livre.prix) }}
</p>
<button
type="button"
:disabled="livre.stock === 0"
@click="emit('ajouter', livre)"
>
{{ livre.stock === 0 ? "Épuisé" : "Ajouter au panier" }}
</button>
</article>
</template>
<style scoped>
.carte {
margin-bottom: 0.5rem;
padding: 0.5rem 1rem;
border: 1px solid #e2d8c9;
border-radius: 8px;
}
.prix {
color: #a8520a;
font-weight: 700;
}
</style>
<script setup>
import { ref } from "vue";
import CarteLivre from "./CarteLivre.vue";
const livres = [
{ isbn: "9782956300014", titre: "Programmation Java", prix: 32, stock: 12 },
{ isbn: "9782956300045", titre: "Physique générale", prix: 59, stock: 0 },
];
const panier = ref([]);
</script>
<template>
<CarteLivre
v-for="livre in livres"
:key="livre.isbn"
:livre="livre"
@ajouter="panier.push($event.titre)"
/>
<p>Panier : {{ panier.join(", ") || "vide" }}</p>
</template>
Après un clic sur « Ajouter au panier » :
Programmation Java
32,00 €
Ajouter au panier
Physique générale
59,00 €
Épuisé
Panier : Programmation Java

Par rapport à la version CDN, le gabarit quitte la page HTML, la fonction euros est déclarée dans le script et directement utilisable, et l'objet d'options disparaît au profit des macros. Le style scoped ne touche que les éléments de la carte : un autre élément de classe prix ailleurs dans la page ne serait pas coloré.
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.