Maison >interface Web >js tutoriel >Comment implémenter correctement les routes protégées dans React Router Dom ?

Comment implémenter correctement les routes protégées dans React Router Dom ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-23 15:22:10463parcourir

How to Correctly Implement Protected Routes in React Router Dom?

Comment créer une route protégée avec react-router-dom ?

Problème

Le code suivant est une tentative de création d'un route protégée dans une application React utilisant react-router-dom:

import { useContext } from "react";
import { globalC } from "./context";
import { Route, Switch, BrowserRouter } from "react-router-dom";
import About from "./About";
import Dashboard from "./Dashboard";
import Login from "./Login";
import PageNotFound from "./PageNotFound";

function Routes() {
  const { authLogin } = useContext(globalC);
  console.log("authLogin", authLogin);

  return (
    <BrowserRouter>
      <Switch>
        {authLogin ? (
          <>
            <Route path="/dashboard" component={Dashboard} exact />
            <Route exact path="/About" component={About} />
          </>
        ) : (
          <Route path="/" component={Login} exact />
        )}

        <Route component={PageNotFound} />
      </Switch>
    </BrowserRouter>
  );
}

export default Routes;

Cependant, ce code ne fonctionne pas comme prévu. L'utilisateur peut accéder aux itinéraires protégés même s'il n'est pas connecté.

Solution

Il y a deux problèmes principaux avec le code :

  1. Le composant Switch ne gère rien d'autre que les composants Route et Redirect. Si vous souhaitez « imbriquer » les composants de route, vous devez envelopper chacun d'eux dans un composant Route.
  2. Le composant de connexion ne gère pas la redirection de l'utilisateur vers la route d'origine à laquelle il essayait d'accéder après s'être connecté. dans.

Voici une version corrigée du code qui résout ces deux problèmes :

import { useContext } from "react";
import { globalC } from "./context";
import { Route, Switch, BrowserRouter, Redirect } from "react-router-dom";
import About from "./About";
import Dashboard from "./Dashboard";
import Login from "./Login";
import PageNotFound from "./PageNotFound";

function Routes() {
  const { authLogin } = useContext(globalC);
  console.log("authLogin", authLogin);

  return (
    <BrowserRouter>
      <Switch>
        <Route path="/" exact>
          {authLogin ? <Redirect to="/dashboard" /> : <Login />}
        </Route>
        <Route path="/dashboard">
          {authLogin ? <Dashboard /> : <Redirect to="/" />}
        </Route>

        <Route exact path="/About" component={About} />
        <Route component={PageNotFound} />
      </Switch>
    </BrowserRouter>
  );
}

export default Routes;

Dans ce corrigé code :

  1. Chaque composant Route est enveloppé dans un composant Route parent.
  2. Le composant Login utilise un composant Redirect pour rediriger l'utilisateur vers la page du tableau de bord après s'être connecté.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn