Props, Emits & Slots
C141 — Séance 6 — 5 mars 2026
Ouvrez le playground Vue.js et codez avec moi !
Ouvrir le Playground Vue.jsplay.vuejs.org — aucun compte requis
Découper une application en morceaux réutilisables et indépendants
Passer des données du parent vers l'enfant avec defineProps()
Communiquer de l'enfant vers le parent avec defineEmits()
Injecter du contenu HTML dans un composant enfant
Une application Vue.js est un arbre de composants imbriqués, comme des poupées russes.
Chaque composant est un fichier .vue autonome avec son propre template, script et style.
Un fichier .vue = un composant autonome
Avec <script setup>
Le composant importé est automatiquement disponible dans le template. Pas besoin de l'enregistrer !
Rendu : <p>Un composant enfant !</p>
Les props permettent de passer des données du composant parent vers le composant enfant
const msg = ref("Salut")
defineProps({ msg: String })
defineProps() est une macro — pas besoin de l'importer
Valeur statique : msg="Salut"
Valeur dynamique : :msg="variable"
Les props sont en lecture seule. L'enfant ne peut pas modifier une prop !
Rendu : <p>Hello du parent</p>
Les emits permettent à l'enfant d'envoyer des événements au parent
@response="(msg) => childMsg = msg"
defineEmits(['response'])
Rendu : <p>hello de l'enfant</p>
Les slots permettent au parent d'injecter du HTML dans le template de l'enfant
Un composant avec un slot, c'est comme un cadre photo : le cadre est toujours le même, mais on peut y mettre n'importe quelle photo.
Le contenu principal injecté dans <slot />
Plusieurs emplacements : <slot name="header" />
Affiché si aucun contenu n'est fourni : <slot>Fallback</slot>
Si le parent ne fournit pas de contenu, "Contenu de secours" est affiché
Rendu : <div class="card">Message: depuis le parent</div>
Parent → Enfant
Données en lecture seule
Enfant → Parent
Événements personnalisés
Injection de contenu
HTML flexible et réutilisable
| Mécanisme | Direction | Type de données | Cas d'usage |
|---|---|---|---|
| Props | Parent → Enfant | String, Number, Object, Array... | Configurer un composant |
| Emits | Enfant → Parent | Événements + arguments | Notifier le parent d'une action |
| Slots | Parent → Enfant | HTML / Composants | Personnaliser le rendu |
Complétez les 4 étapes du tutoriel officiel pour pratiquer les concepts
Créez un composant PokemonCard.vue qui :
v-for
Créez un composant CarteAvecSlots.vue avec :
header pour le titre
footer pour les actions