首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在将元素传递到私有路由时应响应Router6:

在将元素传递到私有路由时应响应Router6:
EN

Stack Overflow用户
提问于 2022-01-08 13:17:08
回答 1查看 83关注 0票数 2

我正在尝试创建一个PrivateRoute组件,如下所示:

代码语言:javascript
复制
import { useStoreState } from 'easy-peasy';
import React, { Component } from 'react';
import { Navigate, Route } from 'react-router-dom';

// import styles from'./index.module.scss';

interface PrivateRouteProps {
  path: string;
  element: Component;
}
const PrivateRoute: React.FC<PrivateRouteProps> = ({
  path,
  element,
  children,
  ...props
}) => {
  const isLoggedIn = useStoreState((state: any) => state.user.isLoggedIn);

  if (!isLoggedIn) {
    return <Navigate to="/login" />;
  }

  return (
    <Route path={path} element={element} {...props}>
      {children}
    </Route>
  );
};
export default PrivateRoute;

这就是我试图使用的方法:

代码语言:javascript
复制
function App() {
  return (
    <div className={styles.app}>
      <Router>
        <Routes>
          <Route path="" element={<Home />}></Route>
          <Route path="login" element={<Login />}></Route>
          <PrivateRoute path="cohort" element={MyComponent}></PrivateRoute>
        </Routes>
      </Router>
    </div>
  );
}

但是在使用PrivateRoute时,我得到了以下错误:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-08 17:57:47

我以前尝试过的element: React.ComponentType<any>解决了打字错误,但是新的错误是

错误: PrivateRoute不是组件。的所有组件子组件必须是一个或

因此,使用v6反应路由器,只有路由组件可以是路由的子级。请参阅v6文档&您将看到身份验证模式是使用包装器组件来处理auth检查和重定向。

旧的v5模式将不再起作用。

您的PrivateRoute应该是这样的。我已经注释掉了前面的代码,所以您可以看到我所做的更改。

代码语言:javascript
复制
import { useStoreState } from "easy-peasy";
import React, { Component } from "react";
import { Navigate, Route } from "react-router-dom";

// import styles from'./index.module.scss';

interface PrivateRouteProps {
  path: string;
  element: React.ComponentType<any>;
  // element: Component;
}
// const PrivateRoute: React.FC<PrivateRouteProps> = ({
//   path,
//   element,
//   children,
//   ...props
// }) => {
const PrivateRoute = ({ children }: { children: JSX.Element }) => {
  const isLoggedIn = useStoreState((state: any) => state.user.isLoggedIn);

  if (!isLoggedIn) {
    return <Navigate to="/login" />;
  }

  // return (
  //   <Route path={path} element={element} {...props}>
  //     {children}
  //   </Route>
  // );

  return children;
};

export default PrivateRoute;

然后,您的App组件将如下所示

代码语言:javascript
复制
export function App() {
  return (
    <div>
      <Router>
        <Routes>
          <Route path="" element={<Home />}></Route>
          <Route path="login" element={<Login />}></Route>
          {/* <PrivateRoute path="cohort" element={MyComponent}></PrivateRoute> */}
          <Route
            path="cohort"
            element={
              <PrivateRoute>
                <MyComponent />
              </PrivateRoute>
            }
          />
        </Routes>
      </Router>
    </div>
  );
}

在这里,指向代码框https://codesandbox.io/s/reactrouterv6wayofdoingthings-0nmkg?file=/src/App.tsx的链接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70632684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档