react-router V6 怎么动态路由啊

2022-10-14 14:28:29 +08:00
 ohohohh

= =react-route 究竟怎么处理动态路由啊,都给我整麻了,框架是 https://github.com/HalseySpicy/Hooks-Admin 这个,但是研究了好久的动态路由都不行

3386 次点击
所在节点    React
5 条回复
byronzhu
2022-10-14 14:34:58 +08:00
useRoutes 可实现动态路由
byronzhu
2022-10-14 14:42:04 +08:00
```javascript
App.tsx
import React from "react";
import { BrowserRouter } from "react-router-dom";
import YYRouter from "./router";

function App() {
return (
<BrowserRouter>
<YYRouter />
</BrowserRouter>
);
}

export default React.memo(App);
router/index.tsx
import { useRoutes, Navigate } from "react-router-dom";
import { ItemType } from "antd/lib/menu/hooks/useItems";
import LayoutPage from "@/components/Layout";
import { observer } from "mobx-react-lite";
import { fetchAsyncRoute } from "./async";
import LoginPage from "@/pages/Login";
import NotFound from "@/pages/NotFound";
import { useLocation } from "react-router";
import { useApp } from "@/stores";

function YYRouter() {
const app = useApp();
const routes = fetchAsyncRoute(app.user);
const location = useLocation();
const items: ItemType[] = [];

if (app.loading) {
return useRoutes([
{
path: "/",
element: <></>,
children: [{ path: location.pathname, element: <></> }],
},
]);
}

routes.push({
path: "*",
element: <NotFound />,
});

for (let route of routes) {
if (route.item) {
items.push(route.item);
}
}

return useRoutes([
{
path: "/",
element: app.user ? (
<LayoutPage items={items} />
) : (
<Navigate to="/login" replace />
),
children: routes,
},
{
path: "/login",
element: app.user ? <Navigate to="/" replace /> : <LoginPage />,
},
]);
}

export default observer(YYRouter);
router/async.tsx
import { RouteObject } from "react-router-dom";
import { ItemType } from "antd/lib/menu/hooks/useItems";

import HomeRoute from "./modules/home";
import BannerRoute from "./modules/banner";
import RobotRoute from "./modules/robot";
import GivingRoute from "./modules/giving";
import PermissionRoute from "./modules/permission";
import UserRoute from "./modules/user";
import FinanceRoute from "./modules/finance";
import ApplyRoute from "./modules/apply";
import TimeLineRoute from "./modules/timeline";

interface ItemT extends RouteObject {
item?: ItemType;
}
export function fetchAsyncRoute(user?: Api.Admin): ItemT[] {
let routes: ItemT[] = [];

if (!user) return routes;

routes = routes.concat(HomeRoute);

if (user.role === "admin") {
routes = routes.concat(PermissionRoute);
}

if (user.role === "finance" || user.role === "customer_service") {
routes = routes.concat(UserRoute);
routes = routes.concat(FinanceRoute);
} else {
routes = routes.concat(BannerRoute);
routes = routes.concat(RobotRoute);
routes = routes.concat(GivingRoute);
routes = routes.concat(UserRoute);
routes = routes.concat(FinanceRoute);
routes = routes.concat(ApplyRoute);
routes = routes.concat(TimeLineRoute);
}

return routes;
}

```
这是我的后台动态路由实现方式,modules 里是一级路由的定义
zzzzzzzzyp
2022-10-14 15:30:03 +08:00
{ path: '/index', component: '/pages/index' },
{ path: '/index/:id', component: '/pages/index' }
karott7
2022-10-14 16:09:36 +08:00
推荐一下我写的约定式路由插件 https://www.npmjs.com/package/vite-plugin-react-views ,根据文档结构自动生成 routes ,op 的项目路由还是要手动配置,直接引入插件改一下就好了
lblblong
2022-10-14 16:31:55 +08:00
推荐一下我封装的路由库: https://oh-router.netlify.app/zh

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/886919

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX