src/
├── router/
│ ├── rootRoute.tsx
│ ├── staticRoutes.tsx
│ ├── dynamicRoutes.tsx
│ └── index.tsx
├── main.tsx
├── pages/
│ ├── Home.tsx
│ ├── About.tsx
│ └── Admin.tsx
└── components/
└── Navigation.tsx
根路由负责放 Outlet:
import { createRootRoute, Outlet } from '@tanstack/react-router';
import Navigation from '@/components/Navigation'; // 导航栏
export const rootRoute = createRootRoute({
component: () => (
<div>
<Navigation />
<Outlet />
</div>
),
});
这里放不需要权限的静态路由,比如首页、关于页:
import { createRoute } from '@tanstack/react-router';
import { rootRoute } from './rootRoute';
import Home from '@/pages/Home';
import About from '@/pages/About';
export const homeRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/',
component: Home,
});
export const aboutRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/about',
component: About,
});
这里根据权限动态生成路由,比如 admin 权限才能看到:
import { createRoute } from '@tanstack/react-router';
import { rootRoute } from './rootRoute';
import Admin from '@/pages/Admin';
export const adminRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/admin',
component: Admin,
});
import { createRouter } from '@tanstack/react-router';
import { rootRoute } from './rootRoute';
import { homeRoute, aboutRoute } from './staticRoutes';
import { adminRoute } from './dynamicRoutes';
// ⚡️ 动态控制路由
const user = {
role: 'admin', // 你可以换成从登录信息里拿
};
const childrenRoutes = [homeRoute, aboutRoute];
// 如果是管理员,加上 admin 页面
if (user.role === 'admin') {
childrenRoutes.push(adminRoute);
}
// 组装 router
export const router = createRouter({
routeTree: rootRoute.addChildren(childrenRoutes),
});
// 类型声明
declare module '@tanstack/react-router' {
interface Register {
router: typeof router;
}
}
入口不变,还是:
import { RouterProvider } from '@tanstack/react-router';
import { router } from './router';
function App() {
return <RouterProvider router={router} />;
}
export default App;
router/ 目录:拆成 root、静态路由、动态路由。
index.tsx 动态组合出符合权限的路由。
保持代码清晰又灵活,后期新增权限、新页面非常方便!