动态增删路由

除了在创建路由器时静态定义路由,vitarx-router 还支持在运行时动态添加和移除路由,适用于权限控制、按需加载模块等场景。

router.addRoute()

addRoute 方法用于在运行时添加路由:

添加顶级路由

ts
router.addRoute({
  path: '/new-page',
  name: 'new-page',
  component: NewPage
})

添加子路由

通过第二个参数指定父路由,新路由将作为父路由的子路由添加:

ts
router.addRoute(
  {
    path: 'profile',
    name: 'user-profile',
    component: UserProfile
  },
  'user' // 父路由的 name 或 path
)

WARNING

父路由必须存在,否则会抛出错误。建议在添加子路由前使用 hasRoute 检查父路由是否存在。

router.removeRoute()

removeRoute 方法用于移除指定路由,通过路由的 namepath 定位:

ts
// 通过 name 移除
router.removeRoute('user-profile')

// 通过 path 移除
router.removeRoute('/user/profile')

removeRoute 返回布尔值,表示是否成功移除:

ts
const removed = router.removeRoute('non-existent')
console.log(removed) // false

INFO

removeRoute 只删除指定的单条路由记录,不会级联删除子路由。如果需要移除整个路由树,需要逐个移除子路由。

router.hasRoute()

hasRoute 方法用于检查路由是否已注册:

ts
if (router.hasRoute('admin')) {
  router.addRoute({ path: 'dashboard', component: Dashboard }, 'admin')
}

完整示例

以下示例展示了基于权限动态添加路由的常见模式:

ts
import { createRouter } from 'vitarx-router'
import { lazy } from 'vitarx'

// 基础路由 — 所有用户可访问
const router = createRouter({
  routes: [
    { path: '/', component: Home },
    { path: '/login', component: Login },
    { path: '/403', component: Forbidden }
  ]
})

// 管理后台路由 — 仅管理员可访问
const adminRoutes = [
  {
    path: '/admin',
    name: 'admin',
    component: lazy(() => import('./pages/admin/Layout.tsx')),
    children: [
      {
        path: '/admin',
        name: 'admin-index',
        component: lazy(() => import('./pages/admin/Index.tsx'))
      },
      {
        path: '/admin/users',
        name: 'admin-users',
        component: lazy(() => import('./pages/admin/Users.tsx'))
      },
      {
        path: '/admin/posts',
        name: 'admin-posts',
        component: lazy(() => import('./pages/admin/Posts.tsx'))
      }
    ]
  }
]

/**
 * 根据用户权限添加路由
 * @param isAdmin - 是否为管理员
 */
function setupRoutesByPermission(isAdmin: boolean): void {
  if (isAdmin && !router.hasRoute('admin')) {
    for (const route of adminRoutes) {
      router.addRoute(route)
    }
  } else if (!isAdmin && router.hasRoute('admin')) {
    router.removeRoute('admin-posts')
    router.removeRoute('admin-users')
    router.removeRoute('admin-index')
    router.removeRoute('admin')
  }
}

// 用户登录后根据权限设置路由
async function onUserLogin() {
  const user = await fetchCurrentUser()
  setupRoutesByPermission(user.isAdmin)
}