Dierenasiel De Warme Poot met React Router
Download het starterproject en voer daarna npm install uit.
📂 Naam project:
lab-router-petshelter
🔗 Basisproject: de vereiste begincode is inbegrepen in het starterproject.
Het starterproject is de oplossing van de oefening Dierenasiel De Warme Poot uit het vorige labo. De site werkt met een ThemeContext en een DierenContext, maar alles staat nog op één lange pagina. In dit labo verdeel je de site over meerdere pagina's met React Router:
| URL | Pagina |
|---|---|
/ | Startpagina met de intro en de statistieken |
/dieren | Overzicht van alle dieren, met de filter op soort |
/dieren/:id | Detailpagina van één dier |
/dieren/:id/adopteer | Formulier om een dier te adopteren |
| alle andere URL's | Pagina niet gevonden |
De CSS voor de nieuwe pagina's staat al klaar in App.css (zie het laatste deel van dat bestand). Je hoeft dus enkel de componenten te schrijven.
Deel 1: De router opzetten
-
Installeer React Router:
npm install react-router@8 -
Maak in
App.tsxeen router aan metcreateBrowserRouter(data mode). Maak de router buiten hetAppcomponent aan. -
De route
/gebruikt het bestaandeLayoutcomponent als element. Alle pagina's zijn child routes van deze route, zodat de header en de footer op elke pagina zichtbaar blijven. -
Pas
Mainaan: in plaats vanIntro,StatistiekenenDierenOverzichttoont het nu eenOutlet. -
Maak een component
Homemet daarinIntroenStatistieken. Dit is de index route van/. -
Voeg een child route
dierentoe die hetDierenOverzichttoont. -
Toon in
AppeenRouterProvidermet je router. Zet deThemeProvideren deDierenProviderrond deRouterProvider, zodat elke pagina aan de contexts kan.
Vergeet niet dat je RouterProvider importeert uit react-router/dom en al de rest uit react-router.
Deel 2: Navigatie
- Verwijder het component
NavLink.tsxuitsrc/components. Gebruik inNavvoortaan deNavLinkvan React Router. - De navigatie bevat twee links: Home (naar
/) en Onze dieren (naar/dieren). De teller met het aantal dieren dat nog een thuis zoekt, blijft staan. - Geef elke
NavLinkde klassennav-linken het thema. De actieve link krijgt van React Router automatisch de klasseactiveen licht zo op in de navigatiebalk. - Het logo linksboven is nu nog een gewone
<a href="#">. Vervang dit door eenLinknaar de startpagina. - Voeg een route toe voor URL's die niet bestaan. Maak hiervoor een component
PageNotFoundmet een titel, een korte tekst en eenLinkterug naar de startpagina. Gebruik de klassenniet-gevonden,sectie-titel,niet-gevonden-tekstenmeer-info. De pagina moet binnen de layout getoond worden, dus met header en footer.
Surf naar bijvoorbeeld /katten om te controleren dat je pagina getoond wordt.
Deel 3: Detailpagina van een dier
- Maak een component
DierDetailen voeg de routedieren/:idtoe. - Haal met
useParamshetiduit de URL en zoek het dier op in deDierenContext. Let op: een URL parameter is altijd een string. - Toon het dier in een
<section>met de klassedier-detail. Hergebruik daarvoor de componentenDierAvatar,DierInfoenAdopteerKnop. Zet bovenaan eenLinkmet de klasseterug-linken de tekst← Terug naar onze dieren. - Bestaat er geen dier met dat id (bv.
/dieren/99of/dieren/abc), toon dan de titelDit dier bestaat nietmet een link terug naar/dieren. - Voeg in
DierKaarteenLinkmet de tekstMeer info(klassemeer-info) toe die naar de detailpagina van het dier gaat.
Deel 4: De filter in de URL
In DierenOverzicht wordt de gekozen soort nu bijgehouden met useState. Als je de pagina herlaadt of de link doorstuurt, ben je de filter kwijt.
- Vervang de
useStatedooruseSearchParams. De gekozen soort staat in de query parametersoort, bijvoorbeeld/dieren?soort=kat. - Lees de soort rechtstreeks uit de URL. Controleer of de waarde wel
hond,katofkonijnis; in alle andere gevallen (ook als de parameter ontbreekt) toon je alle dieren. - Kiest de gebruiker Alle dieren, dan verdwijnt de parameter uit de URL (
/dierenin plaats van/dieren?soort=alle).
Test of de filter behouden blijft als je de pagina herlaadt, en of de terugknop van de browser je naar de vorige filter brengt.
Deel 5: Adoptieformulier
Een dier adopteer je niet meer met één klik. De knop Ik wil adopteren brengt je naar een formulier.
- Pas
AdopteerKnopaan: is het dier nog niet geplaatst, dan toon je eenLinkmet de klasseadopteer-knopnaar/dieren/:id/adopteer. Is het dier wel geplaatst, dan blijven de uitgeschakelde knopHeeft een thuisen de knopAnnuleerstaan. - Maak een component
AdoptieFormulieren voeg de routedieren/:id/adopteertoe. Het formulier (klasseadoptie-formulier) bevat:- een titel, bv.
Bobby adopteren; - een invoerveld voor je naam (een controlled component met
useState, klassenformulier-labelenformulier-veld); - een knop
Bevestig adoptiedie uitgeschakeld is zolang de naam leeg is.
- een titel, bv.
- Bij het versturen van het formulier roep je
adopteer(id)aan en navigeer je metuseNavigatenaar de detailpagina van het dier. Zorg ervoor dat de gebruiker met de terugknop van de browser niet opnieuw op het formulier terechtkomt. - Wie naar het formulier van een dier surft dat al geplaatst is, wordt meteen doorgestuurd naar de detailpagina van dat dier. Gebruik hiervoor het
Navigatecomponent.
Extra
- Voeg op de pagina
/diereneen select toe om te sorteren (Standaard volgordeofJongste eerst). Bewaar de keuze in de query parametersort=leeftijd. Zorg ervoor dat de soortfilter en de sortering elkaar niet overschrijven:/dieren?soort=kat&sort=leeftijdmoet werken. - Geef de route
/eenerrorElement. GebruikuseRouteErrorenisRouteErrorResponseom te tonen wat er misgelopen is.