diff --git a/CORRECTION_router.md b/CORRECTION_router.md new file mode 100644 index 0000000..95331cc --- /dev/null +++ b/CORRECTION_router.md @@ -0,0 +1,133 @@ +# 🔧 Correction — React Router : pourquoi ça plante + +D'abord, une **bonne nouvelle** : avoir `BrowserRouter` dans `main.jsx` **et** `Routes`/`Route` dans `App.jsx`, ce **n'est pas** une erreur — c'est exactement le **bon dĂ©coupage** : +- `main.jsx` **enveloppe** toute l'app dans `` (il « allume » le routeur). +- `App.jsx` **dĂ©clare les routes** (``/``). + +Ton vrai bug est ailleurs. 👇 + +--- + +## 🐛 Le bug : tu rends ton app **deux fois** dans `main.jsx` + +```jsx +createRoot(document.getElementById("root")).render( + + + , +); + +createRoot(document.getElementById("root")).render( // ❌ un DEUXIÈME render dans le mĂȘme #root + + + , +); +``` + +Tu appelles `createRoot(...).render(...)` **deux fois** sur le **mĂȘme** `#root`. Le **second** Ă©crase le premier. Or le second n'a **pas** de `` → ton app finit affichĂ©e **sans routeur**. + +RĂ©sultat : quand `App` rencontre ``, React ne trouve aucun routeur autour → erreur du genre **« useRoutes() may be used only in the context of a `` »**, et page blanche. + +> 🧠 **À retenir :** il n'y a **qu'un seul** `createRoot(...).render(...)` dans toute l'app — c'est le point d'entrĂ©e unique. On n'en met pas deux. + +--- + +## ✅ La correction : UN seul `render`, qui imbrique tout + +On garde `StrictMode` **et** `BrowserRouter`, en les **emboĂźtant** (l'un dans l'autre), avec un seul `render` : + +```jsx +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { BrowserRouter } from "react-router-dom"; +import "./index.css"; +import App from "./App.jsx"; + +createRoot(document.getElementById("root")).render( + + + + + , +); +``` + +> 🔎 L'ordre habituel : `StrictMode` (un outil de dev de React) **autour de** `BrowserRouter` **autour de** `App`. Comme des poupĂ©es russes. + +**✅ Test :** la page d'accueil (`/`) s'affiche, plus d'erreur de ``. Va sur une URL `/trilogie/3` → ta page `Details` s'affiche. + +--- + +## 💡 Variante : oĂč mettre `` ? + +Les **deux** placements sont corrects, choisis-en **un seul** : + +**Option 1 (celle de l'Ă©noncĂ©) — dans `main.jsx`** (autour de ``) : +```jsx +// main.jsx + + + + + +``` +```jsx +// App.jsx +function App() { + return ( + + } /> + ... + + ); +} +``` + +**Option 2 — dans `App.jsx`** (autour des ``) : +```jsx +// App.jsx +import { BrowserRouter, Routes, Route } from "react-router-dom"; +function App() { + return ( + + + } /> + ... + + + ); +} +``` +(et dans ce cas, **pas** de `BrowserRouter` dans `main.jsx`.) + +> đŸ§© **La seule rĂšgle :** il faut **un** ``, et il doit **envelopper** tes ``. Que ce soit dans `main.jsx` ou dans `App.jsx`, peu importe — mais **pas les deux**, et jamais deux `BrowserRouter`. + +--- + +## 🔎 VĂ©rifie aussi + +Ton `App.jsx` est bon : +```jsx + + } /> + } /> + +``` +Assure-toi juste que **`pages/Accueil.jsx` contient bien ta liste** (cartes + recherche + tri + formulaire + total) — c'est elle, maintenant, ta page d'accueil. Si « / » est vide, c'est que le contenu n'a pas Ă©tĂ© dĂ©placĂ© dans `Accueil`. + +Et dans `Carte`, pour aller vers le dĂ©tail, utilise un `` (pas un ``) : +```jsx +import { Link } from "react-router-dom"; +Voir les dĂ©tails +``` +(il te faudra passer `id` en prop Ă  la `Carte` depuis `Accueil`.) + +--- + +## ✅ RĂ©cap +- [ ] **Un seul** `createRoot(...).render(...)` dans `main.jsx` +- [ ] EmboĂźter `StrictMode > BrowserRouter > App` +- [ ] VĂ©rifier que `pages/Accueil.jsx` contient bien ta liste +- [ ] `` dans les cartes pour naviguer + +> 💬 À garder : `BrowserRouter` (dans `main`) = « j'allume le routeur » ; `Routes`/`Route` (dans `App`) = « voici quelle page pour quelle URL ». Et **un seul** `render`.