From ddd62a230085fc0ff3a6b37e8e9fb306c027924c Mon Sep 17 00:00:00 2001 From: matthieureynier Date: Thu, 25 Jun 2026 09:13:00 +0200 Subject: [PATCH] Contact: correction BarreRecherche (composant a props, hooks dans le composant, fragment) + Badge (passer Type App->Carte->Badge) + enonce React #3 (formulaire, tri, React Router) --- CORRECTION_barre_recherche.md | 116 +++++++++++++++++++++++++ ENONCE_react_3_contact.md | 155 ++++++++++++++++++++++++++++++++++ 2 files changed, 271 insertions(+) create mode 100644 CORRECTION_barre_recherche.md create mode 100644 ENONCE_react_3_contact.md diff --git a/CORRECTION_barre_recherche.md b/CORRECTION_barre_recherche.md new file mode 100644 index 0000000..5607840 --- /dev/null +++ b/CORRECTION_barre_recherche.md @@ -0,0 +1,116 @@ +# 🔧 Correction — `BarreRecherche.jsx` (+ le Badge) + +Super boulot : ton app **marche** (likes par carte, total qui monte, donnĂ©es chargĂ©es via `fetch`, persistance `localStorage`). 👏 Il te reste Ă  **bien dĂ©couper** (Module H) et Ă  rĂ©parer le Badge. On y va. + +--- + +## 🐛 Pourquoi `BarreRecherche.jsx` casse tout + +Ton fichier actuel : +```jsx +const [jeux, setJeux] = useState([]); // ❌ hook AU NIVEAU DU FICHIER +const [recherche, setRecherche] = useState(""); // ❌ idem +useEffect(() => { ... }, [jeux]); // ❌ idem + +function BarreRecherche() { + return ( + + {filtres.length === 0 &&

...

} // ❌ plusieurs Ă©lĂ©ments sans <> + {filtres.map(...)} + ); +} +``` + +Trois erreurs : +1. **Les hooks (`useState`, `useEffect`) doivent ĂȘtre DANS le composant**, pas au niveau du fichier. Hors d'une fonction composant, ils n'ont aucun sens → erreur. +2. **Un composant doit renvoyer UN seul Ă©lĂ©ment.** LĂ , tu renvoies un `` **et** des `

`/`` cĂŽte Ă  cĂŽte → erreur JSX. (On enveloppe avec `<> 
 ` quand il y en a plusieurs.) +3. Tu essaies de remettre **tout** (Ă©tat, liste, total) dans `BarreRecherche` — alors que ça marche dĂ©jĂ  trĂšs bien dans `App`. + +> 🧠 **L'erreur de raisonnement :** tu veux « sortir » du code dans un composant, mais tu emmĂšnes l'**Ă©tat** avec. Or l'Ă©tat doit **rester dans `App`** (c'est lui qui orchestre). Un petit composant comme `BarreRecherche` doit ĂȘtre **« bĂȘte »** : il reçoit ce dont il a besoin en **props**, et ne dĂ©cide de rien. + +--- + +## ✅ La bonne version : un composant qui reçoit des **props** + +`BarreRecherche` n'a besoin que de **deux choses** : la valeur Ă  afficher, et quoi faire quand on tape. On les lui passe en props. + +### `BarreRecherche.jsx` +```jsx +function BarreRecherche({ valeur, onChange }) { + return ( + + ); +} + +export default BarreRecherche; +``` +> 🔎 Pas de `useState` ici, pas de liste, pas de total. Juste un input qui **affiche** `valeur` et **remonte** les frappes via `onChange`. C'est tout son travail. + +### Dans `App.jsx` : l'Ă©tat RESTE ici, on passe les props +```jsx +import BarreRecherche from "./components/BarreRecherche"; + +// ... dans le return, Ă  la place de ton : + setRecherche(e.target.value)} +/> +``` + +> đŸ§© **À retenir :** l'Ă©tat (`recherche`, `total`, `jeux`
) vit dans `App`. Les petits composants reçoivent des **props** (des donnĂ©es + des fonctions) et restent **simples et rĂ©utilisables**. C'est exactement la mĂȘme idĂ©e que `Carte` qui reçoit `onLike`. + +**✅ Test :** la recherche fonctionne **exactement comme avant**, mais l'`` est maintenant dans son propre composant propre. + +> 💡 Tu peux faire pareil pour la **liste** : un composant `Liste` qui reçoit le tableau filtrĂ© et fait le `.map()`. `App` ne ferait plus qu'**assembler** ``, ``, `