Formulaires
Controlled Components
Le concept : Habituellement, le DOM gère son propre état dans les formulaires (ce que l'utilisateur tape reste dans le champ input).
Dans React, l'approche recommandée est celle des Composants Contrôlés. Le State de React devient "l'unique source de vérité" : il dicte la valeur du champ, et chaque frappe de clavier met à jour le State, qui remet à jour le champ instantanément.
💡 Single Source of Truth
Dans un formulaire HTML classique, l'input garde son propre état interne. En React, on veut que le State soit la seule source de vérité.
C'est le pattern "Composant Contrôlé" :
- L'input affiche la valeur du State (
value={state}). - L'input déclenche un changement (
onChange). - Le handler met à jour le State (
setState). - React re-render l'input avec la nouvelle valeur.
function Form() { const [text, setText] = useState(""); return ( <input type="text" value={ text } // Source de vérité = State onChange={ e => setText(e.target.value) } /> ); }
const [form, setForm] = useState({ email: "", password: "" }); const handleChange = (e) => { // Met à jour uniquement la clé correspondante (name="email" ou "password") setForm({ ...form, [e.target.name]: e.target.value }); }; // <input name="email" value={form.email} onChange={handleChange} />
const handleSubmit = (e) => { e.preventDefault(); if (!email.includes("@")) { setError("Email invalide"); return; } // Envoi des données... };
🚀 Quick Tip : Uncontrolled
Pour des formulaire très simples ou
l'intégration de librairies non-React, vous pouvez utiliser useRef pour
lire la valeur seulement à la soumission, sans re-render à chaque frappe.
const inputRef = useRef(); // Accès : inputRef.current.value
📝 Analogie : Formulaire Papier vs Tablette
Uncontrolled (HTML classique) : Vous remplissez un formulaire papier.
Personne ne vérifie rien tant que vous ne l'avez pas rendu au guichet (Submit).
Controlled (React State) : Une tablette qui vérifie chaque champ
pendant que vous tapez (rouge si erreur, vert si bon). C'est plus de code, mais
une meilleure UX.
// Pour les GROS formulaires, Controlled est lent. // Utilisez "React Hook Form" (Uncontrolled + Hooks). import { useForm } from "react-hook-form"; const { register, handleSubmit } = useForm(); <input {...register("email")} />