javascript - 如果用户已登录并且在所有其他情况下显示公共(public)路线,如何重定向到/仪表板公共(public)路线/登录和/注册?

标签 javascript reactjs react-router-dom

我有两种类型的路由 Public 和 Private。

只有用户登录后才能访问所有私有(private)路由:

return tokenService.token 
  ? (
    <>
      <Header />
      <Suspense fallback={<Spinner className="spinner" />}>
        <Outlet />
      </Suspense>
      <Footer />
    </>
  ) : (
    <Navigate to={'/login'} replace />
  );

然后我们有公共(public)路线。可以在除 /login/registration 路由之外的任何地方访问,即使它们是公开的,如果用户已登录,它们也应该被重定向到/dashboard所有其他情况,我们显示公共(public)路线。

这是我们的公共(public)路由文件

return (
  <>
    <AuthHeader />
    <Suspense fallback={<Spinner className="spinner" />}>
      <Outlet />
    </Suspense>
    <Footer />
  </>
)

主要路线文件

<Routes>
  <Route element={<PublicRoute />}>
    <Route path={'/login'} element={<Login />} />
    <Route
      path={'/registration'}
      element={<Registration />}
    />
    <Route path={'/terms'} element={<Terms />} />
    <Route path={'/privacy'} element={<Privacy />} />
  </Route>
  <Route element={<AuthRoute />}>
    <Route path={'/dashboard'} element={<MyProfile />} /> 
  </Route>
  <Route path={'/notfound'} element={<PageNotFound />} />
</Routes>

那么将 "/login""/registration" 路由重定向到 "/dashboard" 路由的最有效方法是什么?如果用户已登录并且在所有其他情况下都显示公共(public)路线?

所以用户应该能够从任何地方访问"/terms",但是如果他登录了,那么他就不能访问"/login""/registration" 路由(重定向到 "/dashboard")。

在当前代码中,即使用户已登录,他也可以访问所有公共(public)路由。

最佳答案

为登录和仪表板路由创建一个匿名路由保护器,它与私有(private)路由保护器相反。

例子:

const AnonymousRoute = () => {
  return tokenService.token
    ? <Navigate to="/dashboard" replace />
    : <Outlet />;
};
<Routes>
  <Route element={<PublicRoute />}>
    <Route element={<AnonymousRoute />}>
      <Route path="/login" element={<Login />} />
      <Route
        path="/registration"
        element={<Registration />}
      />
    </Route>
    <Route path="/terms" element={<Terms />} />
    <Route path="/privacy" element={<Privacy />} />
  </Route>
  <Route element={<AuthRoute />}>
    <Route path="/dashboard" element={<MyProfile />} /> 
  </Route>
  <Route path="/notfound" element={<PageNotFound />} />
</Routes>

关于javascript - 如果用户已登录并且在所有其他情况下显示公共(public)路线,如何重定向到/仪表板公共(public)路线/登录和/注册?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75068127/

相关文章:

javascript - React 路由器正在更改 URL,但无法正确加载网页

javascript - 通过 javascript 尝试 gcloud 函数命令时 json 无效

javascript - 通过不等式查询firestore

reactjs - React Native firestore 时间戳为空

reactjs - React router v4 在离开页面时获取用户确认

reactjs - 如何让 React Router v6 响应 404 状态码

javascript - 如何在 Angularjs 服务中使用作为 ES6 模块导入的外部 JavaScript 库?

javascript - 通过 Jquery 将类添加到 div

javascript - 使等宽文本尽可能大而不会导致溢出或换行

javascript - 重定向到 React 路由器 4 中的登录页面