React、Ant Design 5.0 构建通用后台管理系统界面 - 路由注册

发布时间 2023-04-24 01:49:30作者: EvilChan

涉及依赖

  • react-router-dom

src/router/index.tsx

import { IndexRouteObject, NonIndexRouteObject } from 'react-router-dom'

// 重写react-router-dom的RouteObject
export type RouteObject = CustomIndexRouteObject | CustomNonIndexRouteObject

// 添加路由元信息meta, 路由标题,图标等,都可以放在这
interface CustomIndexRouteObject extends IndexRouteObject {
  meta?: Record<string, unknown>
}

// 添加路由元信息meta, 路由标题,图标等,都可以放在这
interface CustomNonIndexRouteObject extends NonIndexRouteObject {
  meta?: Record<string, unknown>
  children?: RouteObject[]
}

const routes: RouteObject[] = [
  {
    path: '/',
    element: <div>首页</div>,
    meta: {
      title: '首页',
    },
  },
  {
    path: 'system',
    element: <div>系统管理</div>,
    meta: {
      title: '系统管理',
    },
  },
]

export default routes

App.tsx

import { BrowserRouter, Link, Outlet, Route, Routes } from 'react-router-dom'
import routes, { RouteObject } from './router'

function App() {
  // 路由对象转标签
  const convert = (route: RouteObject) => {
    if (Array.isArray(route.children)) {
      return (
        <Route key={route.path} path={route.path} element={route.element}>
          {route.children.map((item) => convert(item))}
        </Route>
      )
    } else {
      return (
        <Route key={route.path} path={route.path} element={route.element} />
      )
    }
  }

  return (
    <BrowserRouter>
      <Routes>
        <Route
          path="/"
          element={
            <div>
              <Link to={'/'}>首页</Link>
              <Link to={'/system'}>系统管理</Link>
              <Outlet />
            </div>
          }
        >
          {routes.map((route) => convert(route))}
        </Route>
      </Routes>
    </BrowserRouter>
  )
}

export default App

现在在界面应该就能看到首页和系统管理的文本链接,点击后能显示对应的内容,浏览器并无跳转。后期会联合Antd Menu的属性对路由对象进行改进。