当前位置: 首页 > 知识库问答 >
问题:

React-router v6 专用路由运行不正常

田佐
2023-03-14

我想用反应路由器V6实现私有和公共路由,我已经尝试了StackOverflow上所有可用的解决方案,它似乎不起作用。这就是为什么我需要澄清。

// App.tsx 
<Suspense
          fallback={
            <Flex height={"90vh"} justifyContent="center" alignItems={"center"}>
              <Spinner colorScheme={"primary.400"} />
            </Flex>
          }
        >
          <Routes>
            <Route path="/" element={<Home />} />
            <Route
              path="/dashboard"
              element={
                <PrivateRoute>
                  <Dashboard />
                </PrivateRoute>
              }
            />
            <Route
              path="/product/:id"
              element={
                <PrivateRoute>
                  <ProductDetails />
                </PrivateRoute>
              }
            />
            <Route path="/login" element={<Login />} />
            <Route
              path="/upload"
              element={
                <PrivateRoute>
                  <Upload />
                </PrivateRoute>
              }
            />
          </Routes>
        </Suspense>


// PrivateRoute.tsx
    export const PrivateRoute = ({ children }: any) => {
      const user = localStorage.getItem("user");
    
      if (user) {
        console.log("Yes, user exist");
      } else {
        console.log("No user");
      }
    
      if (!user) {
        return <Navigate to="/login" />;
      }
    
      return children;
    };

当我登录时,我仍然可以手动导航到登录页面,它会呈现,而不是将我推送到仪表板页面。为什么??

共有1个答案

农飞星
2023-03-14

您的"/login"路径只是常规的不受保护的路由,因此我希望用户(任何用户)能够不受限制地访问该路由。

您可以做的是创建一种您的Private ateRoute的“逆”,它检查身份验证状态并弹回经过身份验证的用户。像这样的路由通常称为“匿名”路由。

示例:

export const AnonymousRoute = ({ children }: any) => {
  const user = localStorage.getItem("user");

  if (user) {
    console.log("Yes, user exist");
  } else {
    console.log("No user");
  }

  if (user) {
    return <Navigate to="/dashboard" />;
  }

  return children;
};

用法:

<Suspense
  fallback={
    <Flex height={"90vh"} justifyContent="center" alignItems={"center"}>
      <Spinner colorScheme={"primary.400"} />
    </Flex>
  }
>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route
      path="/dashboard"
      element={
        <PrivateRoute>
          <Dashboard />
        </PrivateRoute>
      }
    />
    <Route
      path="/product/:id"
      element={
        <PrivateRoute>
          <ProductDetails />
        </PrivateRoute>
      }
    />
    <Route
      path="/login"
      element={
        <AnonymousRoute>
          <Login />
        </AnonymousRoute>
      }
    />
    <Route
      path="/upload"
      element={
        <PrivateRoute>
          <Upload />
        </PrivateRoute>
      }
    />
  </Routes>
</Suspense>
 类似资料:
  • 在我的React项目中,我有: 没有标题的登录组件 问题:我应该如何构建我的路由器从登录页面开始,当我点击登录时,路由器会把我带到仪表板?

  • 我已经稍微调整了React路由器的私有路由示例,以便与Redux玩得很好,但是当链接或重定向到其他页面时,不会呈现任何组件。这个例子可以在这里找到: https://reacttraining.com/react-router/web/example/auth-workflow 他们的PrivateRoute组件如下所示: 但是,因为我已经把它合并到一个Redux应用程序中,我不得不稍微调整一下私

  • 我意识到以前有人问过我这个问题,请容忍我,因为我还在学习这个问题。我想我已经尝试了所有的解决方案,但是没有运气。 问题是:当重定向到时,它没有呈现预期的组件() 我已经实现了一个,如下所示; privaterout.js 这就是我使用它的地方; index.js 在这个问题中要补充几点: 我确认重定向确实发生在(我通过将

  • 问题内容: 我对React还是比较陌生,我正在尝试弄清楚如何使React路由器正常工作。我有一个超级简单的测试应用程序,看起来像这样: 当我运行该应用程序时,home组件加载没有任何麻烦,并且当我单击“ Click Me”链接时,URL更改为localhost / about,但是什么也没有发生。如果单击刷新,则会显示“无法获取/关于”。显然我在做错事,但我一直无法弄清楚是什么。我也在使用Webp

  • 我已经被困在这个问题上好几天了,我需要互联网的帮助。 我已经为我的react应用程序创建了一个静态HTML登录页项目(这两个项目是分开的),我希望使用Nginx为这两个项目提供服务。我的登录页项目有自己的目录结构和资产,如下所示: 我的React应用程序是一个创建React应用程序,据我所知,在运行npm build之后,它会为您提供一个名为的文件夹,并将所有项目文件正确绑定,以便您可以部署它。现

  • 问题内容: 我的目标是让http:// mydomain / route1 渲染React组件Component1和http:// mydomain / route2 渲染Component2。因此,我认为编写如下的路由是很自然的: http:// mydomain / route1可以正常工作,但http:// mydomain / route2却呈现Component1。 然后,我阅读了此问题