OUJOOD.COM
Introduction
Les props (contraction de "properties") sont un concept fondamental dans React. Elles permettent de transmettre des données d'un composant parent à un composant enfant, facilitant ainsi la communication entre différents éléments de votre application.
Dans ce chapitre, nous allons explorer :
- Qu'est-ce que les props ?
- Comment les utiliser pour transmettre des données entre composants ?
- Des exemples pratiques pour illustrer leur fonctionnement.
Qu'est-ce que les Props ?
Les props sont des valeurs transmises d'un composant parent à un composant enfant sous forme de propriétés. Elles peuvent transporter n'importe quel type de donnée : des chaînes de caractères, des nombres, des objets, des tableaux, ou même des fonctions.
Voici un exemple simple où un composant parent transmet une prop appelée nom
à un composant enfant :
function Bonjour({ nom }) { return <h1>Bonjour, {nom} !</h1>; } ReactDOM.render(<Bonjour nom="Alice" />, document.getElementById('root'));
Explication :
function Bonjour({ nom })
: Définit un composant fonctionnel qui accepte une prop appeléenom
.{nom}
: Insère dynamiquement la valeur de la propnom
dans le JSX.<Bonjour nom="Alice" />
: Utilise le composantBonjour
avec la propnom
définie à "Alice".
Comment Utiliser les Props ?
Les props (contraction de "properties") sont des valeurs transmises d'un composant parent à un composant enfant dans React. Elles permettent aux composants de communiquer entre eux et de rendre des interfaces utilisateur dynamiques. Dans cette section, nous allons explorer comment utiliser les props étape par étape.
1. Passage de Données Simples via les Props
Imaginons que vous souhaitiez créer un composant qui affiche un message personnalisé. Vous pouvez passer ce message en tant que prop depuis le composant parent. Voici comment cela fonctionne :
function Saluer({ message, nom }) { return <p>{message}, {nom} !</p>; } function App() { return ( <div> <Saluer message="Bonjour" nom="Alice" /> <Saluer message="Salut" nom="Bob" /> </div> ); } ReactDOM.render(<App />, document.getElementById('root'));
Explication détaillée :
-
function Saluer({ message, nom }) { ... }
:- Cette ligne définit un composant fonctionnel appelé
Saluer
. { message, nom }
utilise la destructuration pour extraire automatiquement les propriétésmessage
etnom
des props passées au composant.
- Cette ligne définit un composant fonctionnel appelé
-
return <p>{message}, {nom} !</p>;
:- Ce composant retourne du JSX contenant un élément
<p>
. {message}
et{nom}
insèrent dynamiquement les valeurs des props correspondantes dans le texte affiché.
- Ce composant retourne du JSX contenant un élément
-
function App() { ... }
:- Nous créons un composant parent appelé
App
. - Ce composant utilise deux fois le composant
Saluer
, mais avec des valeurs différentes pour les propsmessage
etnom
.
- Nous créons un composant parent appelé
-
<Saluer message="Bonjour" nom="Alice" />
:- Ici, nous utilisons le composant
Saluer
avec deux props : message="Bonjour"
: La valeur "Bonjour" est passée à la propmessage
.nom="Alice"
: La valeur "Alice" est passée à la propnom
.
- Ici, nous utilisons le composant
-
ReactDOM.render(<App />, document.getElementById('root'));
:- Cette ligne rend le composant
App
dans l'élément HTML ayant l'idroot
. - Lorsque
App
est rendu, il inclut deux instances du composantSaluer
, chacun avec ses propres props.
- Cette ligne rend le composant
2. Passage de Fonctions via les Props
Les props ne se limitent pas aux données simples comme des chaînes de caractères ou des nombres. Vous pouvez également passer des fonctions en tant que props. Cela permet aux composants enfants de communiquer avec leurs parents. Voici un exemple :
function Bouton({ onClick, label }) { return ( <button onClick={onClick}> {label} </button> ); } function ComposantParent() { function handleClick() { alert("Bouton cliqué !"); } return <Bouton onClick={handleClick} label="Cliquez ici" />; } ReactDOM.render(<ComposantParent />, document.getElementById('root'));
Explication détaillée :
-
function Bouton({ onClick, label }) { ... }
:- Ceci définit un composant fonctionnel appelé
Bouton
. { onClick, label }
extrait deux props :onClick
(une fonction) etlabel
(une chaîne de caractères).
- Ceci définit un composant fonctionnel appelé
-
return (<button onClick={onClick}>{label}</button>);
:- Ce composant retourne un bouton avec deux attributs :
onClick={onClick}
: Lorsque le bouton est cliqué, la fonction passée via la proponClick
sera exécutée.{label}
: Insère dynamiquement le texte du bouton passé via la proplabel
.
-
function ComposantParent() { ... }
:- Ce composant parent s'appelle
ComposantParent
. - Il contient une fonction appelée
handleClick
, qui affiche une alerte lorsque le bouton est cliqué.
- Ce composant parent s'appelle
-
<Bouton onClick={handleClick} label="Cliquez ici" />
:- Ici, nous utilisons le composant
Bouton
en lui passant deux props : onClick={handleClick}
: La fonctionhandleClick
définie dans le parent est passée en tant que prop.label="Cliquez ici"
: Le texte "Cliquez ici" est passé comme prop pour être affiché sur le bouton.
- Ici, nous utilisons le composant
-
ReactDOM.render(<ComposantParent />, document.getElementById('root'));
:- Cette ligne rend le composant
ComposantParent
dans l'élément HTML ayant l'idroot
. - Lorsque vous cliquez sur le bouton, l'alerte "Bouton cliqué !" s'affiche grâce à la fonction passée via la prop
onClick
.
- Cette ligne rend le composant
3. Exemple Concret : Compteur avec Communication Parent-Enfant
Voici un exemple plus avancé où un composant parent transmet une fonction à un composant enfant pour modifier son état. Cela illustre comment les props peuvent être utilisées pour établir une communication entre composants.
import React, { useState } from 'react'; function ComposantParent() { const [message, setMessage] = useState("Salut !"); function handleChange(nouveauMessage) { setMessage(nouveauMessage); } return ( <div> <h1>{message}</h1> <ComposantEnfant onMessageChange={handleChange} /> </div> ); } function ComposantEnfant({ onMessageChange }) { return ( <button onClick={() => onMessageChange("Coucou depuis l'enfant !")}> Modifier le message </button> ); } ReactDOM.render(<ComposantParent />, document.getElementById('root'));
Explication détaillée :
-
import React, { useState } from 'react';
:- Nous importons React et le hook
useState
pour gérer l'état local dans le composant parent.
- Nous importons React et le hook
-
function ComposantParent() { ... }
:- Ce composant parent s'appelle
ComposantParent
. - Il utilise
useState
pour initialiser une variable d'état appeléemessage
avec la valeur "Salut !". function handleChange(nouveauMessage)
: Cette fonction met à jour l'étatmessage
lorsqu'elle est appelée.
- Ce composant parent s'appelle
-
<ComposantEnfant onMessageChange={handleChange} />
:- Le composant parent passe la fonction
handleChange
au composant enfant via une prop appeléeonMessageChange
.
- Le composant parent passe la fonction
-
function ComposantEnfant({ onMessageChange }) { ... }
:- Ce composant enfant s'appelle
ComposantEnfant
. - Il reçoit une prop appelée
onMessageChange
, qui est une fonction passée depuis le parent.
- Ce composant enfant s'appelle
-
<button onClick={() => onMessageChange("Coucou depuis l'enfant !")}>
:- Ce bouton appelle la fonction passée via la prop
onMessageChange
lorsqu'il est cliqué. "Coucou depuis l'enfant !"
est la nouvelle valeur que le composant enfant transmet au parent pour mettre à jour l'état.
- Ce bouton appelle la fonction passée via la prop
-
ReactDOM.render(<ComposantParent />, document.getElementById('root'));
:- Cette ligne rend le composant parent
ComposantParent
dans l'élément HTML ayant l'idroot
. - Lorsque vous cliquez sur le bouton, le texte affiché dans le composant parent change dynamiquement grâce à la fonction passée via les props.
- Cette ligne rend le composant parent
4. Validation des Props avec PropTypes
Pour garantir que les props passées à un composant sont valides, React fournit une bibliothèque appelée prop-types
. Voici un exemple simple :
import PropTypes from 'prop-types'; function Bonjour({ nom }) { return <h1>Bonjour, {nom} !</h1>; } // Validation des props Bonjour.propTypes = { nom: PropTypes.string.isRequired // La prop "nom" doit être une chaîne de caractères et est obligatoire }; ReactDOM.render(<Bonjour nom="Alice" />, document.getElementById('root'));
Explication détaillée :
-
import PropTypes from 'prop-types';
:- Nous importons la bibliothèque
prop-types
pour valider les props.
- Nous importons la bibliothèque
-
Bonjour.propTypes = { nom: PropTypes.string.isRequired };
:- Cette ligne spécifie que la prop
nom
doit être une chaîne de caractères (string
) et est obligatoire (isRequired
). - Si une valeur non valide est passée ou si la prop est manquante, React affichera un avertissement dans la console.
- Cette ligne spécifie que la prop
-
<Bonjour nom="Alice" />
:- Ce composant respecte la validation car la prop
nom
est une chaîne de caractères et est fournie.
- Ce composant respecte la validation car la prop
5. Définition de Valeurs Par Défaut avec defaultProps
Si certaines props sont optionnelles, vous pouvez leur donner des valeurs par défaut. Voici un exemple :
function Saluer({ message, nom }) { return <p>{message}, {nom} !</p>; } // Définition des valeurs par défaut Saluer.defaultProps = { message: "Bonjour", nom: "Utilisateur" }; ReactDOM.render(<Saluer />, document.getElementById('root')); // Résultat : Bonjour, Utilisateur !
Explication détaillée :
-
Saluer.defaultProps = { message: "Bonjour", nom: "Utilisateur" };
:- Cette ligne définit des valeurs par défaut pour les props
message
etnom
. - Si ces props ne sont pas fournies lors de l'utilisation du composant, elles prendront automatiquement ces valeurs.
- Cette ligne définit des valeurs par défaut pour les props
-
<Saluer />
:- Ici, nous n'avons pas passé de props au composant
Saluer
. - React utilisera donc les valeurs par défaut définies précédemment :
message="Bonjour"
etnom="Utilisateur"
.
- Ici, nous n'avons pas passé de props au composant
6. Meilleures Pratiques pour Utiliser les Props
Pour utiliser les props efficacement dans vos applications React, voici quelques conseils pratiques :
- Définissez toujours des types pour vos props : Utilisez
PropTypes
ou TypeScript pour valider les types des props et éviter les erreurs. - Évitez de manipuler directement les props : Les props sont immuables, c'est-à-dire qu'elles ne peuvent pas être modifiées directement par le composant enfant. Si vous devez modifier une valeur, utilisez plutôt l'état (
state
) ou passez une fonction depuis le parent. - Nommez vos props de manière explicite : Utilisez des noms clairs pour rendre votre code plus lisible et compréhensible.
- Utilisez des valeurs par défaut : Définissez des valeurs par défaut pour les props optionnelles afin d'éviter les erreurs lorsque ces props ne sont pas fournies.
7. Conclusion
Les props sont un outil puissant dans React qui permettent de transmettre des données et des fonctions entre composants. En combinant props, état et validation, vous pouvez créer des interfaces utilisateur dynamiques et robustes. Maintenant que vous comprenez comment utiliser les props, vous êtes prêt à explorer des concepts plus avancés comme les événements React.
Props Validations avec PropTypes
Pour garantir que les props passées à un composant sont valides, React fournit une bibliothèque appelée prop-types
. Voici comment l'utiliser :
import PropTypes from 'prop-types'; function Bonjour({ nom }) { return <h1>Bonjour, {nom} !</h1>; } // Validation des props Bonjour.propTypes = { nom: PropTypes.string.isRequired // La prop "nom" doit être une chaîne de caractères et est obligatoire }; ReactDOM.render(<Bonjour nom="Alice" />, document.getElementById('root'));
Explication :
import PropTypes from 'prop-types';
: Importe la bibliothèqueprop-types
.Bonjour.propTypes = { ... }
: Définit les types attendus pour les props.nom: PropTypes.string.isRequired
: Spécifie que la propnom
doit être une chaîne de caractères et est obligatoire.
Passage de Valeurs Par Défaut avec defaultProps
Vous pouvez définir des valeurs par défaut pour les props en cas où elles ne sont pas fournies. Voici un exemple :
function Saluer({ message, nom }) { return <p>{message}, {nom} !</p>; } // Définition des valeurs par défaut Saluer.defaultProps = { message: "Bonjour", nom: "Utilisateur" }; ReactDOM.render(<Saluer />, document.getElementById('root')); // Résultat : Bonjour, Utilisateur !
Explication :
Saluer.defaultProps = { ... }
: Définit des valeurs par défaut pour les props.message: "Bonjour"
etnom: "Utilisateur"
: Si aucune valeur n'est passée pour ces props, elles prendront ces valeurs par défaut.
Exemple Complexe : Communication Parent-Enfant avec Props
Voici un exemple montrant comment un composant parent peut transmettre une fonction à un composant enfant pour lui permettre de modifier l'état du parent.
import React, { useState } from 'react'; function ComposantParent() { const [message, setMessage] = useState("Salut !"); function handleChange(nouveauMessage) { setMessage(nouveauMessage); } return ( <div> <h1>{message}</h1> <ComposantEnfant onMessageChange={handleChange} /> </div> ); } function ComposantEnfant({ onMessageChange }) { return ( <button onClick={() => onMessageChange("Coucou depuis l'enfant !")}> Modifier le message </button> ); } export default ComposantParent;
Explication :
const [message, setMessage] = useState("Salut !");
: Initialise l'étatmessage
avec la valeur "Salut !" dans le composant parent.function handleChange(nouveauMessage)
: Définit une fonction qui met à jour l'état du parent.<ComposantEnfant onMessageChange={handleChange} />
: Passe la fonctionhandleChange
au composant enfant via une prop appeléeonMessageChange
.<button onClick={() => onMessageChange("Coucou depuis l'enfant !")}>
: Lorsque le bouton est cliqué, il appelle la fonction passée via la prop pour mettre à jour l'état du parent.
Meilleures Pratiques pour Utiliser les Props
Pour tirer pleinement parti des props dans vos applications React, voici quelques conseils :
- Définissez des types pour vos props : Utilisez
PropTypes
ou TypeScript pour valider les types des props et éviter les erreurs. - Évitez de manipuler directement les props : Les props sont immuables. Si vous devez modifier une valeur, utilisez plutôt l'état (
state
) ou passez une fonction depuis le parent. - Nommez vos props de manière explicite : Utilisez des noms clairs pour rendre votre code plus lisible.
- Utilisez des valeurs par défaut : Définissez des valeurs par défaut pour les props optionnelles.
Conclusion
Vous avez maintenant appris à utiliser les props dans React pour transmettre des données et des fonctions entre composants. En combinant props et état, vous pouvez créer des interfaces utilisateur dynamiques et interactives.
Prochain chapitre : Événements React