> 웹 프론트엔드 > JS 튜토리얼 > React Router v5 및 v6에서 보호 경로를 구현하는 방법은 무엇입니까?

React Router v5 및 v6에서 보호 경로를 구현하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-20 18:14:16
원래의
855명이 탐색했습니다.

How to Implement Protected Routes in React Router v5 and v6?

react-router-dom을 사용하여 보호 경로를 만드는 방법은 무엇입니까?

문제

<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>
로그인 후 복사

스위치가 작동하지 않습니다. Route 및 Redirect 구성 요소 이외의 렌더링을 처리합니다. 이와 같이 "중첩"하려면 각 경로를 일반 경로로 래핑해야 하지만 이는 전혀 필요하지 않습니다.


또한 로그인 구성 요소는 " home" 페이지 또는 원래 액세스되었던 개인 경로.

해결책

react-router-dom v6

버전 6에서는 사용자 정의 경로 구성요소가 인기를 얻지 못했으며, 선호되는 방법은 인증 레이아웃을 사용하는 것입니다. 컴포넌트.

import { Navigate, Outlet } from 'react-router-dom';

const PrivateRoutes = () => {
  const location = useLocation();
  const { authLogin } = useContext(globalC);

  if (authLogin === undefined) {
    return null; // or loading indicator/spinner/etc
  }

  return authLogin
    ? <Outlet />
    : <Navigate to="/login" replace state={{ from: location }} />;
}
로그인 후 복사

...

<BrowserRouter>
  <Routes>
    <Route path="/" element={<PrivateRoutes />} >
      <Route path="dashboard" element={<Dashboard />} />
      <Route path="about" element={<About />} />
    </Route>
    <Route path="/login" element={<Login />} />
    <Route path="*" element={<PageNotFound />} />
  </Routes>
</BrowserRouter>
로그인 후 복사

또는

const routes = [
  {
    path: "/",
    element: <PrivateRoutes />,
    children: [
      {
        path: "dashboard",
        element: <Dashboard />,
      },
      {
        path: "about",
        element: <About />
      },
    ],
  },
  {
    path: "/login",
    element: <Login />,
  },
  {
    path: "*",
    element: <PageNotFound />
  },
];
로그인 후 복사

...

export default function Login() {
  const location = useLocation();
  const navigate = useNavigate();
  const { authLogin, loginData } = useContext(globalC);

  useEffect(() => {
    if (authLogin) {
      const { from } = location.state || { from: { pathname: "/" } };
      navigate(from, { replace: true });
    }
  }, [authLogin, location, navigate]);

  return (
    <div
     >
로그인 후 복사

react-router-dom v5

인증을 사용하는 PrivateRoute 구성 요소 생성 컨텍스트.

const PrivateRoute = (props) => {
  const location = useLocation();
  const { authLogin } = useContext(globalC);

  if (authLogin === undefined) {
    return null; // or loading indicator/spinner/etc
  }

  return authLogin ? (
    <Route {...props} />
  ) : (
    <Redirect
      to={{
        pathname: "/login",
        state: { from: location }
      }}
    />
  );
};
로그인 후 복사

액세스 중인 원래 경로로 다시 리디렉션을 처리하도록 로그인 구성 요소를 업데이트하세요.

export default function Login() {
  const location = useLocation();
  const history = useHistory();
  const { authLogin, loginData } = useContext(globalC);

  useEffect(() => {
    if (authLogin) {
      const { from } = location.state || { from: { pathname: "/" } };
      history.replace(from);
    }
  }, [authLogin, history, location]);

  return (
    <div
     >
로그인 후 복사

모든 경로를 "플랫 목록"으로 렌더링

function Routes() {
  return (
    <BrowserRouter>
      <Switch>
        <PrivateRoute path="/dashboard" component={Dashboard} />
        <PrivateRoute path="/About" component={About} />
        <Route path="/login" component={Login} />
        <Route component={PageNotFound} />
      </Switch>
    </BrowserRouter>
  );
}
로그인 후 복사

위 내용은 React Router v5 및 v6에서 보호 경로를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿