
Composants contrôlés (Controlled components) : Liaison état et input
Apprenez le concept clé des composants contrôlés en React. Liez l'état (state) de vos composants aux inputs de formulaire pour une gestion centralisée et prédictible.
React prend le contrôle : la philosophie des composants contrôlés
En HTML standard, les éléments de formulaire comme ``, `
C'est là qu'intervient le concept de **composant contrôlé** (Controlled Component). Dans cette approche, l'état du composant React devient la source de vérité unique pour la valeur de l'élément de formulaire. Au lieu de laisser le DOM gérer la valeur, nous la stockons dans le `state` React et nous la passons explicitement à l'élément de formulaire via sa prop `value` (ou `checked` pour les checkboxes/radios).
Pour que l'utilisateur puisse modifier cette valeur, nous devons également fournir une fonction (`onChange`) qui sera appelée à chaque modification de l'input. Cette fonction mettra à jour l'état React, ce qui provoquera un nouveau rendu du composant avec la nouvelle valeur reflétée dans l'input. La boucle est bouclée : l'interaction utilisateur déclenche une mise à jour de l'état, qui à son tour met à jour la valeur affichée dans le formulaire.
Mise en oeuvre : `useState`, `value` et `onChange`
La mise en place d'un composant contrôlé suit un schéma simple et répétitif, principalement basé sur le hook `useState`.
1. **Déclarer un état :** Utilisez `useState` pour créer une variable d'état qui contiendra la valeur actuelle de l'input.
2. **Lier la valeur :** Passez cette variable d'état à la prop `value` de votre élément de formulaire (``, `
3. **Gérer les changements :** Attachez une fonction à l'événement `onChange` de l'élément. Cette fonction recevra l'objet événement synthétique de React. Elle utilisera la fonction de mise à jour de l'état (le deuxième élément retourné par `useState`) pour actualiser la valeur dans l'état, généralement en lisant `event.target.value`.
Prenons l'exemple le plus simple : un champ de saisie de texte (``).
import React, { useState } from 'react';
function NameForm() {
// 1. Déclarer un état pour stocker la valeur de l'input
const [name, setName] = useState('');
// 3. Fonction pour gérer les changements de l'input
const handleChange = (event) => {
// Met à jour l'état 'name' avec la valeur actuelle de l'input
setName(event.target.value);
};
const handleSubmit = (event) => {
alert('Un nom a été soumis : ' + name);
event.preventDefault(); // Empêche le rechargement de la page
};
return (
);
}
export default NameForm;Dans cet exemple, `name` dans l'état React est toujours synchronisé avec la valeur affichée dans le champ de saisie. Chaque frappe de touche déclenche `handleChange`, qui met à jour `name`, ce qui fait que React re-rend le composant et passe la nouvelle valeur à l'attribut `value` de l'input. React contrôle entièrement la valeur de l'input.
Avantages de l'approche contrôlée
L'utilisation des composants contrôlés offre plusieurs avantages significatifs :
1. **Source de vérité unique :** L'état React contient toujours la valeur actuelle du formulaire, simplifiant le raisonnement sur les données.
2. **Validation instantanée :** Puisque chaque changement passe par la fonction `onChange`, vous pouvez y intégrer une logique de validation ou de formatage en temps réel.
3. **Contrôle programmatique :** Vous pouvez facilement modifier la valeur du champ de manière programmatique en mettant simplement à jour l'état (par exemple, pour réinitialiser un formulaire).
4. **Logique conditionnelle simplifiée :** Vous pouvez désactiver le bouton de soumission ou afficher des messages d'erreur basés directement sur l'état qui représente les valeurs du formulaire.
Bien qu'elle nécessite un peu plus de code initial que l'approche HTML classique, la méthode des composants contrôlés est la manière idiomatique et recommandée de gérer les formulaires en React, car elle s'intègre parfaitement au modèle déclaratif et basé sur l'état de la bibliothèque. Nous verrons dans les sections suivantes comment appliquer ce pattern aux autres types d'éléments de formulaire.