如何通过react-router-dom V6和typescript使用受保护的路由?

gin*_*boy 7 typescript reactjs react-router-dom

我正在尝试实施受保护的路线,以仅允许登录的用户访问我的应用程序。我编写的代码似乎有效,当我尝试在未登录的情况下访问主页时,我被重定向到我的登录页面,但是一旦我登录,我可以访问该页面,但我不会呈现,并且出现以下错误:点击此处查看错误

我尝试了多种方法,将元素包装在受保护的路由中似乎是 V6 的处理方式,但它似乎对我不起作用:

我的受保护路线

interface PrivateRouteProps extends RouteProps {
}

const PrivateRoute: React.FC<PrivateRouteProps> = ({...rest}) => {
    const auth = useAuth();

    if (auth?.user === null) {
        return <Navigate to='/'/>;
    }
    return <Route {...rest}/>;
};

export default PrivateRoute;
Run Code Online (Sandbox Code Playgroud)

我的应用程序(路线使用)

function App() {
    useEffect(() => {
      API
        .get('api', '/reservation', {})
        .then(response => {
          console.log(response);
        })
        .catch(error => {
          console.log(error.response);
        });

    }, [])
    return (
      <Router>
        <Routes>
          <Route path='/' element={<LoginPage />}/>
          <Route path='/consultAndReserve' element={<PrivateRoute><Navbar/><ConsultReserve/></PrivateRoute>} />
          <Route path='/consultAndReserve/:date' element={<><Navbar/><ConsultReserveWithDate/></>}/>
          <Route path='/myReservations'  element={<><Navbar/><Reservations/></>}/>
          <Route path='/tracing'  element={<><Navbar/><Tracing/></>}/>
        </Routes>
      </Router>
  );
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Dre*_*ese 10

即使在 TypeScript 中,创建“PrivateRoute”组件也相当简单。

在您的情况下,您无法直接渲染Route错误指出的组件。这是 RRDv5 和 RRDv6 之间的重大变化。您可以渲染children道具,因为您直接包装了要保护的组件。

例子:

const PrivateWrapper = ({ children }: { children: JSX.Element }) => {
  const auth = useAuth();
  return auth?.user ? children : <Navigate to="/" replace />;
};
Run Code Online (Sandbox Code Playgroud)

用法:

<Routes>
  ...
  <Route
    path="/consoleAndReserve"
    element={(
      <PrivateWrapper>
        <Navbar />
        <ConsultReserve />
      </PrivateWrapper>
    )}
  />
  ...
</Routes>
Run Code Online (Sandbox Code Playgroud)

  • `const PrivateWrapper = ({ Children }: { Children: JSX.Element }) =&gt; {` 应该这样做。这要求“children”是一个“JSX.Element”(比“ReactNode”更具体)。您需要该类型才能直接“返回子项”,因为组件只能返回“JSX.Element |” 空`。 (4认同)