Un guide du débutant complet sur React Router (y compris les crochets de routeur)

React est une bibliothèque JavaScript pour la création d'interfaces utilisateur. Nous pouvons également l'étendre pour créer des applications multi-pages à l'aide de React Router. Il s'agit d'une bibliothèque tierce qui permet le routage dans nos applications React.

Dans ce tutoriel, nous allons couvrir tout ce que vous devez savoir pour démarrer avec React Router.

  • Mise en place du projet
  • Qu'est-ce que le routage?
  • Configuration du routeur
  • Rendu des itinéraires
  • Utilisation des liens pour changer de page
  • Passage des paramètres d'itinéraire
  • Naviguer par programmation
  • Redirection vers une autre page
  • Redirection vers une page 404
  • Garder les routes
  • Crochets de routeur
  • useHistory
  • useParams
  • useLocation
  • Dernières pensées
  • Prochaines étapes

Mise en place du projet

Pour pouvoir suivre, vous devrez créer une nouvelle application React en exécutant la commande suivante dans votre terminal:

npx create-react-app react-router-guide 

Ensuite, ajoutez ces lignes de code au App.jsfichier:

import React from "react"; import "./index.css" export default function App() { return (   
  • Home
  • About
  • Contact
); } // Home Page const Home = () => (

Home

); // About Page const About = () => (

About

); // Contact Page const Contact = () => (

Contact

); const FakeText = () => (

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

)

Ensuite, si vous êtes prêt à partir, commençons par répondre à une question importante: qu'est-ce que le routage?

Qu'est-ce que le routage?

Le routage est la capacité d'afficher différentes pages à l'utilisateur. Cela signifie que l'utilisateur peut se déplacer entre différentes parties d'une application en entrant une URL ou en cliquant sur un élément.

Comme vous le savez peut-être déjà, par défaut, React est livré sans routage. Et pour l'activer dans notre projet, nous devons ajouter une bibliothèque nommée react-router.

Pour l'installer, vous devrez exécuter la commande suivante dans votre terminal:

yarn add react-router-dom 

Ou

npm install react-router-dom 

Maintenant, nous avons installé avec succès notre routeur, commençons à l'utiliser dans la section suivante.

excité

Configuration du routeur

Pour activer le routage dans notre application React, nous devons d'abord importer BrowserRouterdepuis react-router-dom.

Dans le App.jsfichier, saisissez ce qui suit:

import React, { Fragment } from "react"; import "./index.css" import { BrowserRouter as Router } from "react-router-dom"; export default function App() { return (    
  • Home
  • About
  • Contact
); }

Cela devrait contenir tout dans notre application où le routage est nécessaire. Cela signifie que si nous avons besoin d'un routage dans toute notre application, nous devons envelopper notre composant supérieur avec BrowserRouter.

Au fait, vous n'êtes pas obligé de renommer BrowserRouter as Routercomme je le fais ici, je veux juste que les choses restent lisibles.

Un routeur seul ne fait pas grand-chose. Ajoutons donc une route dans la section suivante.

Rendu des itinéraires

Pour rendre les routes, nous devons importer le Routecomposant du package du routeur.

Dans votre App.jsfichier, ajoutez le code suivant:

import React, { Fragment } from "react"; import "./index.css" import { BrowserRouter as Router, Route } from "react-router-dom"; export default function App() { return (    
  • Home
  • About
  • Contact

Welcome!

} /> ); }

Ensuite, ajoutez-le là où nous voulons rendre le contenu. Le Routecomposant a plusieurs propriétés. Mais ici, nous avons juste besoin de pathet render.

path: le chemin de l'itinéraire. Ici, nous utilisons /pour définir le chemin de la page d'accueil.

render: will display the content whenever the route is reached. Here, we'll render a welcome message to the user.

In some cases serving routes like that is perfectly fine. But imagine a case when we have to deal with a real component – using render may not be the right solution.

So, how can we display a real component? Well, the Route component has another property named component.

Let's update our example a bit to see it in action.

In your App.js file, add the following code:

import React, { Fragment } from "react"; import "./index.css" import { BrowserRouter as Router, Route } from "react-router-dom"; export default function App() { return (    
  • Home
  • About
  • Contact
); } const Home = () => (

Home

);

Now, instead of rendering a message, our route will load the Home component.

To get the full power of React Router, we need to have multiple pages and links to play with. We already have pages (components if you want, too), so now let's add some links so we can switch between pages.

Using links to switch pages

To add links to our project, we will use the React Router again.

In your App.js file, add the following code:

import React, { Fragment } from "react"; import "./index.css" import { BrowserRouter as Router, Route, Link } from "react-router-dom"; export default function App() { return (    
  • Home
  • About
  • Contact
); } const Home = () => (

Home

); const About = () => (

About

); const Contact = () => (

Contact

);

After importing Link, we have to update our navigation bar a bit. Now, instead of using a tag and href, React Router uses Link and to to, well, be able to switch between pages without reloading it.

Then, we need to add two new routes, About and Contact, to be able to switch between pages or components.

Now, we can go to different parts of our app through links. But there is an issue with our router: the Home component is always displayed even if we switch to other pages.

This is because React Router will check if the path defined starts with /. If that's the case, it will render the component. And here, our first route starts with /, so the Home component will be rendered each time.

However, we can still change the default behavior by adding the exact property to Route.

In App.js, add:

By updating the Home route with exact, now it will be rendered only if it matches the full path.

We can still enhance it by wrapping our routes with Switch to tell to React Router to load only one route at a time.

In App.js, add:

import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";      

Now that we have new links, let's use them to pass parameters.

Passing route parameters

To pass data between pages, we have to update our example.

In your App.js file, add the following code:

import React, { Fragment } from "react"; import "./index.css" import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; export default function App() { const name = 'John Doe' return (    
  • Home
  • About
  • Contact
); } const Home = () => (

Home

); const About = ({match:{params:{name}}}) => ( // props.match.params.name

About {name}

); const Contact = () => (

Contact

);

As you can see here, we start by declaring a new constant name which will be passed as a parameter to the About page. And we append name to the corresponding link.

With that, we now have to update the About route by adjusting its path to receive name as a parameter path="/about/:name".

Now, the parameter will be received as props from the About component. The only thing we have to do now is destructure the props and get back the name property. By the way, {match:{params:{name}}} is the same as props.match.params.name.

We've done a lot up to this point. But in some cases we don't want to use links to navigate between pages.

Sometimes, we have to wait for an operation to finish before navigating to the next page.

se mettre d'accord

So, let's handle that case in the next section.

Navigating programmatically

The props we receive have some convenient methods we can use to navigate between pages.

In App.js, add:

const Contact = ({history}) => (  

Contact

history.push('/') } >Go to home );

Here, we pull the history object from the props we receive. It has some handy methods like goBack, goForward, and so on. But here, we will use the push method to be able to go to the Home page.

Now, let's handle the case when we want to redirect our user after an action.

Redirecting to another page

The React Router has another component named Redirect. As you guessed, it helps us redirect the user to another page

In App.js, add:

import { BrowserRouter as Router, Route, Link, Switch, Redirect } from "react-router-dom"; const About = ({match:{params:{name}}}) => ( // props.match.params.name  { name !== 'John Doe' ?  : null } 

About {name}

);

Now, if the name passed as a parameter is not equal to John Doe, the user will be redirected to the home page.

You could argue that you should redirect the user with props.history.push('/). Well, the Redirect component replaces the page and therefore the user can't go back to the previous page. But, with the push method they can. However, you can use props.history.replace('/) to mimic the Redirect behavior.

Now let's move on and handle the case when the user hits a route that doesn't exist.

Redirecting to a 404 page

To redirect the user to a 404 page, you can create a component to show it. But here, to keep things simple, I will just display a message with render.

import React, { Fragment } from "react"; import "./index.css" import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; export default function App() { const name = 'John Doe' return (    
  • Home
  • About
  • Contact

404: page not found

} /> ); }

The new route we've added will catch every path that doesn't exist and redirect the user to the 404 page.

Now, let's move on and learn how to protect our routes in the next section.

Guarding routes

There are many ways to protect routes to React. But here I will just check if the user is authenticated and redirect them to the appropriate page.

import React, { Fragment } from "react"; import "./index.css" import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; export default function App() { const name = 'John Doe' const isAuthenticated = false return (    
  • Home
  • About
  • Contact
{ isAuthenticated ? : } ); }

As you can see here, I declared a variable to mimic authentication. Then, check if the user is authenticated or not. If they are, render protected pages. Otherwise redirect them to the home page.

We've covered a lot up to this point, but an interesting part remains: router hooks.

Let's move to the final section and introduce Hooks.

Oui

Router Hooks

Router hooks make things much easier. Now you can access the history, location, or parameters in an easy and elegant way.

useHistory

The useHistory hook gives us access to the history instance without pulling it from props.

import { useHistory } from "react-router-dom"; const Contact = () => { const history = useHistory(); return (  

Contact

history.push('/') } >Go to home ) };

useParams

This hook helps us get the parameter passed on the URL without using the props object.

import { BrowserRouter as Router, Route, Link, Switch, useParams } from "react-router-dom"; export default function App() { const name = 'John Doe' return (    
  • Home
  • About
); } const About = () => { const { name } = useParams() return ( // props.match.params.name { name !== 'John Doe' ? : null }

About {name}

) };

useLocation

Ce hook renvoie l'objet de localisation qui représente l'URL actuelle.

import { useLocation } from "react-router-dom"; const Contact = () => { const { pathname } = useLocation(); return (  

Contact

Current URL: {pathname}

) };

Dernières pensées

React Router est une bibliothèque incroyable qui nous aide à passer d'une seule page à une application multi-pages avec une grande convivialité. (Gardez simplement à l'esprit - à la fin de la journée, il s'agit toujours d'une application d'une seule page).

Et maintenant, avec les crochets de routeur, vous pouvez voir à quel point ils sont simples et élégants. Ils sont certainement quelque chose à considérer dans votre prochain projet.

Vous pouvez lire plus de mes articles sur mon blog.

Prochaines étapes

Documentation du React Router

Photo de Joshua Sortino sur Unsplash