• 15 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 19/04/2021

Passez des datas entre les composants

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans les chapitres précédents, vous avez appris à utiliser les props pour passer des données vers un composant. Cependant, cela n'était qu'une utilisation basique des props. Que se passerait-il si nous voulions être plus explicites sur le type de données qui doivent être passées ? Et si nous voulions nous assurer que la prop est passée en continu pour que notre composant bénéficie des propriétés dont il a besoin ? Jetons un œil à tout ça. 👀

Définissez des props en tant qu'objets

Définir les props comme un simple tableau de chaînes de caractères a l'avantage d'être facile à lire et à comprendre. Mais ça manque justement de complexité. Or, nous avons besoin de complexité pour nous assurer que nos props fonctionnent comme nous le souhaitons, peu importe qui utilise la prop.

Par exemple, dans le code ci-dessous, vous remarquerez que le composant prend trois props différentes :

  • list ;

  • title ;

  • count.

<template>
<div>
<h1>{{ title }} #{{ count }}</h1>
<ul>
<li v-for="item in list" :key="item"> {{ item }}
</li>
</ul>
</div>
</template>
<script>
export default {
props: ['list', 'title', 'count']
}
</script>

Cependant, ces props ont des exigences spécifiques, ce qui pose problème. Par exemple,  title  devrait être une  string  mais  list  devrait posséder un comportement itératif, comme un  array  ou un  object. Plutôt que d'espérer que ce soient bien les bonnes données qui sont passées, en croisant les doigts, ce serait quand même bien mieux de pouvoir empêcher le mauvais type de données de passer. Eh bien, c'est possible en définissant les props à l'aide d'un objet au lieu d'un tableau de chaînes de caractères.

<template>
<div>
<h1>{{ title }} #{{ count }}</h1>
<ul>
<li v-for="item in list" :key="item">
{{ item }}
</li>
</ul>
</div>
</template>
<script>
export default {
props: {
list: {},
title: {},
count: {}
}
}
</script>

Ici, la valeur de props est un objet. Les propriétés de cet objet correspondent à chacune des props que vous souhaitez utiliser. Pour cela, à chaque fois, une clé correspondant au nom de la prop (par exemple,  list ) à laquelle est associée un objet servira à définir la configuration de l'objet.

Comme je vous l'ai dit, nous voulons éviter de recevoir le mauvais type de données dans chaque prop. Il faut donc commencer par configurer le type de prop attendu avec la clé  type qui prend comme valeur un type de données JavaScript.

<template>
<div>
<h1>{{ title }} #{{ count }}</h1>
<ul>
<li v-for="item in list" :key="item">
{{ item }}
</li>
</ul>
</div>
</template>
<script>
export default {
props: {
list: {
type: Array
},
title: {
type: String
},
count: {
type: Number
}
}
}
</script>

Par ailleurs, si notre composant a besoin de certaines props pour fonctionner ou avoir l'apparence souhaitée, ce serait génial de pouvoir le configurer. Vous vous en doutez, si je vous dis ça, c'est que Vue rend cela possible. 😏Il suffit d'ajouter la clé required qui prend un booléen en valeur dans notre objet de configuration.

<template>
<div>
<h1>{{ title }} #{{ count }}</h1>
<ul>
<li v-for="item in list" :key="item">
{{ item }}
</li>
</ul>
</div>
</template>
<script>
export default {
props: {
list: {
type: Array
},
title: {
type: String,
required: true
},
count: {
type: Number
}
}
}
</script>

Cet objet nous permet même de définir une valeur par défaut sur les propriétés afin de fournir un contenu par défaut, dans le cas où la prop n'est jamais définie. Pour cela, il vous suffit de préciser la clé default et de lui associer la valeur souhaitée selon vos besoins. Dans notre exemple, cela pourrait ressembler à ce qui suit :

<template>
<div>
<h1>{{ title }} #{{ count }}</h1>
<ul>
<li v-for="item in list" :key="item">
{{ item }}
</li>
</ul>
</div>
</template>
<script>
export default {
props: {
list: {
type: Array,
default: () => []
},
title: {
type: String,
required: true
},
count: {
type: Number,
default: 1
}
}
}
</script>

Entraînez-vous

Vous trouverez le code source des exercices dans le repo GitHub du cours dans le dossier  cafe-with-a-view. Pour commencer, consultez la branche  P3C2-Begin.

Instructions

Utilisez la syntaxe en objet pour définir les propriétés associées à props dans  MenuItem.vue.

En résumé

Dans ce chapitre, vous avez acquis les connaissances pour :

  •     définir des props à l'aide d'un objet ;

  •     définir des types de prop pour minimiser les bugs potentiels ;

  •     utiliser la prop required;

  •     définir une valeur par défaut sur une prop.

Cependant, bien que les props soient parfaites pour passer des informations du composant parent à l'enfant, elles ne fonctionnent pas dans l'autre sens. En d'autres termes, comment communiquer l'information du composant enfant au composant parent ? Nous allons étudier une façon de réaliser cette opération dans le prochain chapitre !

Exemple de certificat de réussite
Exemple de certificat de réussite