Le module react-router-dom
premet de metre en place des route front et de cree une SPA (Single Page Application)
La premiere etapes est d'englober l'application dans BrowserRouter qui permettra d'utiliser differentes routes
1import { createRoot } from "react-dom/client"; 2import { BrowserRouter } from "react-router-dom"; 3 4import Blog from "src/components/Blog"; 5 6const target = document.getElementById("root"); 7 8const root = createRoot(target); 9 10root.render( 11 <BrowserRouter> 12 <Blog /> 13 </BrowserRouter> 14); 15
Le composant Routes permet de determiner une liste de composant qui seront afficher sur des route
Le composant Route permet de decrire l'url et le composant qui sera afficher
Tout les composant a l'exterieur des balises Routes seront commun a tout les autre composant
Ici Header et Footer seront visible sur les routes Post, SingleArticle et NotFound
1import { Routes, Route } from "react-router-dom"; 2 3import Header from "src/components/Header"; 4import Posts from "src/components/Posts"; 5import Footer from "src/components/Footer"; 6import SingleArticle from "src/components/SingleArticle"; 7import NotFound from "src/components/NotFound"; 8 9function Blog() { 10 return ( 11 <div className="blog"> 12 <Header /> 13 14 <Routes> 15 <Route path="/posts" element={<Posts />} /> 16 <Route path="/article/:slug" element={<SingleArticle />} /> 17 <Route path="*" element={<NotFound />} /> 18 </Routes> 19 20 <Footer /> 21 </div> 22 ); 23} 24 25export default Blog; 26
Le module react-router-dom
offre les balise NavLink et Link qui permette de remplacer les balise a en evitant de recharger ma page ce qui permet de crée une SPA
NavLink donne acces a une fonction de className pour gerer si la route est active ou non
1import { NavLink } from "react-router-dom"; 2 3function Header() { 4 return ( 5 <header className="menu"> 6 <nav> 7 <NavLink 8 to="/" 9 className={({ isActive }) => 10 isActive ? "menu-link menu-link--selected" : "menu-link" 11 } 12 > 13 {category.label} 14 </NavLink> 15 <button className="menu-btn" type="button"> 16 Click 17 </button> 18 </nav> 19 </header> 20 ); 21} 22 23export default Header; 24
Ce hook permet de recuperer les parametre des url
1import { useParams } from "react-router-dom"; 2 3import Post from "../Post"; 4import NotFound from "../NotFound"; 5 6function SingleArticle({ posts }) { 7 const params = useParams(); 8 9 const foundPost = posts.find((post) => post.slug === params.slug); 10 11 if (!foundPost) { 12 return <NotFound />; 13 } 14 15 return ( 16 <div> 17 <Post postInfo={foundPost} /> 18 </div> 19 ); 20} 21 22export default SingleArticle; 23
Permet de crée une redirection
Ici si on click sur le bouton on sera rediriger sur une nouvelle route sans rechargement
1import { useNavigate } from "react-router-dom"; 2 3function Posts() { 4 const navigate = useNavigate(); 5 6 return ( 7 <main> 8 <button type="button" onClick={() => navigate(`/article/toto`)}> 9 Click 10 </button> 11 </main> 12 ); 13} 14 15export default Posts; 16
Permet d'obtenir toutes les information comme l'url sur la quelle l'utilisateur ce situe
Ici a chaque fois que l'utilisateur changera de route le scroll de la page sera ramener en au de page
1import { Routes, Route, useLocation } from "react-router-dom"; 2import { useEffect } from "react"; 3 4import Menu from "src/components/Menu"; 5import Home from "src/components/Home"; 6import Recipe from "src/components/Recipe"; 7import Error from "src/components/Error"; 8 9function App() { 10 const location = useLocation(); 11 12 useEffect(() => { 13 window.scrollTo(0, 0); 14 }, [location.pathname]); 15 16 return ( 17 <div className="app"> 18 <Menu /> 19 <Routes> 20 <Route path="/" element={<Home />} /> 21 <Route path="/recipe/:slug" element={<Recipe />} /> 22 <Route path="*" element={<Error />} /> 23 </Routes> 24 </div> 25 ); 26} 27 28export default App; 29