我有一个简单的Reaction项目和下一个组件层次 struct :

主要组件(这里我称为路由服务并在路径中呈现组件):

const App: React.FC = () => {
    return <BaseLayout>{RoutingService.getRoutes()}</BaseLayout>;
}

export default App;

路由服务代码:

class RoutingService {
    static getRoutes = (): React.ReactNode => {
        return (
            <Routes>
                <Route key={makeRandomKey()} path={PATHS.ROOT_PATH} element={<MainPage/>}/>
                <Route key={makeRandomKey()} path={PATHS.AUTH_PATH} element={<LoginPage/>}/>
                <Route key={makeRandomKey()} path={PATHS.NOT_FOUND_PATH} element={<UnderConstructPage/>}/>
                <ProtectedRoute path={PATHS.SEARCH_HISTORY_PATH} element={<SearchHistoryPage/>}/>
                <ProtectedRoute path={PATHS.USER_CABINET_PATH} element={<UserCabinetPage/>}/>
            </Routes>
        );
    };
}

export default RoutingService;

所以我想执行-有一些开放的路由(页面)为所有用户(已登录和未登录),如主页面,未找到和身份验证页面. 但我有一些页面需要限制非登录用户的访问.为此,我创建了ProtectedRouting组件,当用户未登录并try 访问需要登录的页面时,该组件应将用户重定向到身份验证页面.

interface ProtectedRouteProps {
    path: string;
    element: React.ReactNode;
}

const ProtectedRoute: React.FC<ProtectedRouteProps> = ({path, element}) => {
    const isAuthenticated: boolean = useSelector((state: RootState) => !!state.user.userData?.auth?.token);

    return isAuthenticated ?
        <Route path={path} element={element}/> : <> <Navigate to="/auth" replace/></> ;
};

export default ProtectedRoute;

不幸的是,我得到了错误:

router.ts:5 Uncaught Error: [ProtectedRoute] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>
    at invariant (router.ts:5:1)

ProtectedRoute个组件中似乎有<Navigate>个组件引发了此错误,但我不知道如何正确实现此重定向.如何解决这个问题?

推荐答案

让我们试一试代码:

在RoutingService.tsx中

            <Routes>
                <Route key={makeRandomKey()} path={PATHS.ROOT_PATH} element={<MainPage />} />
                <Route key={makeRandomKey()} path={PATHS.AUTH_PATH} element={<LoginPage />} />
                <Route element={<ProtectedRoute />}> 
                    <Route key={makeRandomKey()} path={PATHS.SEARCH_HISTORY_PATH} element={<SearchHistoryPage />} />
                    <Route key={makeRandomKey()} path={PATHS.USER_CABINET_PATH} element={<UserCabinetPage />} />
                </Route>
                <Route key={makeRandomKey()} path={PATHS.NOT_FOUND_PATH} element={<UnderConstructPage />} /> // not found should at end line
            </Routes>

在ProtectedRoute.tsx中

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

interface ProtectedRouteProps {}

const ProtectedRoute: React.FC<ProtectedRouteProps> = () => {
    const isAuthenticated: boolean = useSelector((state: RootState) => !!state.user.userData?.auth?.token);

    if (!isAuthenticated) {
        return <Navigate to="/auth" replace />;
    }

    return <Outlet />; // This is SearchHistoryPage, UserCabinetPage 
};

export default ProtectedRoute;

Javascript相关问答推荐

如何解决这个未能在响应上执行json:body stream已读问题?

Vega中的模运算符

按钮未放置在html dis位置

django无法解析余数:[0] from carray[0]'

Google图表时间轴—更改hAxis文本 colored颜色

在网页上添加谷歌亵渎词

康威的生活游戏规则在我的Javascript版本中不起作用.''我做错了什么?

我们如何从一个行动中分派行动

为什么Mutations 观察器用微任务队列而不是macrotask队列处理?

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

如何在Angular拖放组件中同步数组?

扩展类型的联合被解析为基类型

更改agGRID/Reaction中的单元格格式

Next.js无法从外部本地主机获取图像

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

表单数据中未定义的数组键

对不同目录中的Angular material 表列进行排序

JavaScript:多个图像错误处理程序

如何设置时间选取器的起始值,仅当它获得焦点时?

在范围数组中查找公共(包含)范围