Router 实例
Router 实例是 vitarx-router 的核心对象,提供了路由导航、历史记录管理、守卫注册、动态路由操作等能力。通过 createRouter()、createWebRouter() 或 createMemoryRouter() 创建。
push()
编程式导航到新的路由页面,会在历史记录中添加一条新记录。
类型定义
push<T extends RouteIndex>(target: T | NavOptions<T> | RouteLocation): Promise<NavigateResult>参数
| 参数 | 类型 | 说明 |
|---|---|---|
| target | T | NavOptions<T> | RouteLocation | 导航目标。可以是路由路径字符串、路由名称、NavOptions 对象或 RouteLocation 对象 |
返回值
| 类型 | 说明 |
|---|---|
Promise<NavigateResult> | 导航结果对象,包含导航状态和相关信息 |
示例
// 通过路径导航
await router.push('/users')
// 通过路径 + 查询参数
await router.push({ index: '/users', query: { page: '1' } })
// 通过路由名称导航
await router.push('userDetail')
// 通过名称 + 动态参数
await router.push({ index: 'userDetail', params: { id: '123' } })
// 带 hash 导航
await router.push({ index: '/about', hash: '#section' })replace()
替换当前路由页面,不会在历史记录中添加新记录,而是替换当前记录。
类型定义
replace<T extends RouteIndex>(target: T | NavOptions<T> | RouteLocation): Promise<NavigateResult>参数
| 参数 | 类型 | 说明 |
|---|---|---|
| target | T | NavOptions<T> | RouteLocation | 导航目标,与 push() 相同 |
返回值
| 类型 | 说明 |
|---|---|
Promise<NavigateResult> | 导航结果对象 |
详情
replace() 的行为与 push() 类似,区别在于它不会向历史记录栈中添加新条目,而是替换当前条目。常用于重定向场景或"登录后跳转"等不需要回退的情况。
示例
// 替换当前路由
await router.replace('/login')
// 通过名称替换
await router.replace({ index: 'home' })go()
在历史记录中前进或后退指定步数。
类型定义
go(delta: number): void参数
| 参数 | 类型 | 说明 |
|---|---|---|
| delta | number | 跳转步数。正数前进,负数后退,0 无效果 |
示例
// 后退一步
router.go(-1)
// 前进两步
router.go(2)
// 无效果
router.go(0)back()
后退到上一个历史记录,等价于 go(-1)。
类型定义
back(): void示例
router.back()forward()
前进到下一个历史记录,等价于 go(1)。
类型定义
forward(): void示例
router.forward()beforeEach()
注册全局前置守卫。当路由匹配成功后、导航确认前执行。守卫可以拦截导航、重定向或放行。
类型定义
beforeEach(guard: NavigationGuard): () => void参数
| 参数 | 类型 | 说明 |
|---|---|---|
| guard | NavigationGuard | 前置守卫函数。返回 false 拦截导航,返回 NavTarget 重定向,返回 void 或 true 放行 |
详情
守卫函数签名:
type NavigationGuard = (this: Router, to: RouteLocation, from: RouteLocation | null) => GuardResultto:目标路由位置from:来源路由位置(首次导航时为null)- 返回
false:阻止导航 - 返回
NavTarget或RouteIndex:重定向到新目标 - 返回
void或true:放行导航
多次调用 beforeEach() 会注册多个守卫,按注册顺序依次执行。
示例
router.beforeEach((to, from) => {
if (to.path.startsWith('/admin') && !isAuthenticated()) {
return { index: '/login' } // 重定向到登录页
}
// 放行
})
// 异步守卫
router.beforeEach(async (to, from) => {
await checkAuth()
})afterEach()
注册全局后置钩子。在导航成功结束后执行,无法影响导航结果。
类型定义
afterEach(hook: AfterCallback): () => void参数
| 参数 | 类型 | 说明 |
|---|---|---|
| hook | AfterCallback | 后置钩子函数 |
详情
钩子函数签名:
type AfterCallback = (this: Router, to: RouteLocation, from: RouteLocation) => void后置钩子不接受返回值,仅用于执行副作用(如日志记录、页面统计等)。
示例
router.afterEach((to, from) => {
// 记录页面访问
analytics.trackPageView(to.path)
})addRoute()
动态添加路由规则到路由表中。
类型定义
addRoute(route: Route, parent?: RouteIndex): void参数
| 参数 | 类型 | 说明 |
|---|---|---|
| route | Route | 路由配置对象 |
| parent | RouteIndex | 可选的父路由索引(路径或名称),添加为子路由 |
示例
// 添加顶级路由
router.addRoute({ path: '/new-page', component: NewPage })
// 添加为子路由
router.addRoute({ path: 'profile', component: Profile }, 'user')removeRoute()
动态移除路由规则。
类型定义
removeRoute(index: RouteIndex): void参数
| 参数 | 类型 | 说明 |
|---|---|---|
| index | RouteIndex | 路由索引,可以是路由路径或路由名称 |
示例
// 通过路径移除
router.removeRoute('/old-page')
// 通过名称移除
router.removeRoute('oldRoute')hasRoute()
检查指定路由是否存在于路由表中。
类型定义
hasRoute(index: RouteIndex): boolean参数
| 参数 | 类型 | 说明 |
|---|---|---|
| index | RouteIndex | 路由索引,可以是路由路径或路由名称 |
返回值
| 类型 | 说明 |
|---|---|
boolean | 路由存在返回 true,否则返回 false |
示例
if (router.hasRoute('/admin')) {
// 路由存在
}
if (router.hasRoute('userDetail')) {
// 路由存在
}init()
手动初始化路由器。仅 WebRouter 支持此方法,防止重复初始化。
类型定义
init(): this返回值
| 类型 | 说明 |
|---|---|
this | 当前路由器实例,支持链式调用 |
详情
初始化过程会执行以下操作:
- 根据当前 URL 执行初始路由替换
- 监听
popstate事件,处理浏览器前进/后退 - 监听
hashchange事件,处理 URL hash 变化
如果路由器已经初始化,再次调用 init() 会直接返回当前实例,不会重复初始化。
示例
const router = createWebRouter({ routes: [...] }, false)
router.beforeEach(guard)
router.init() // 手动初始化isReady()
等待路由器完成首次导航。如果首次导航已完成,Promise 会立即解析。
类型定义
isReady(): Promise<void>返回值
| 类型 | 说明 |
|---|---|
Promise<void> | 路由就绪后解析 |
详情
如果路由器尚未初始化,调用 isReady() 会返回一个被拒绝的 Promise,错误信息为 "Router is not initialized."。
示例
await router.isReady()
// 路由已就绪,可以安全访问 router.routedestroy()
销毁路由器实例,清理所有内部状态和事件监听。
类型定义
destroy(): void详情
销毁操作会:
- 重置就绪状态
- 清空路由表
- 移除浏览器事件监听(
WebRouter的popstate和hashchange) - 清空历史记录(
MemoryRouter)
通常仅在单元测试中使用。
示例
// 测试结束后清理
afterEach(() => {
router.destroy()
})route
当前路由位置的只读响应式对象。
类型定义
readonly route: DeepReadonly<RouteLocation>返回值
| 类型 | 说明 |
|---|---|
DeepReadonly<RouteLocation> | 深层只读的当前路由位置对象 |
详情
route 是响应式的,当路由发生变化时会自动更新。可以监听其属性变化来响应路由切换。
示例
// 访问当前路径
console.log(router.route.path)
// 访问路由参数
console.log(router.route.params.id)
// 访问查询参数
console.log(router.route.query.page)routes
获取所有已注册的路由记录数组。
类型定义
readonly routes: RouteRecord[]返回值
| 类型 | 说明 |
|---|---|
RouteRecord[] | 路由记录数组 |
示例
// 遍历所有路由
router.routes.forEach(record => {
console.log(record.path, record.name)
})matchRoute()
根据导航目标匹配路由,返回路由位置对象。
类型定义
matchRoute(target: NavTarget, redirectFrom?: RouteLocation): RouteLocation | null参数
| 参数 | 类型 | 说明 |
|---|---|---|
| target | NavTarget | 导航目标对象 |
| redirectFrom | RouteLocation | 可选的重定向来源 |
返回值
| 类型 | 说明 |
|---|---|
RouteLocation | null | 匹配成功返回路由位置对象,否则返回 null |
示例
const location = router.matchRoute({ index: '/user', params: { id: '123' } })
if (location) {
console.log(location.path, location.params)
}buildUrl()
根据路径、查询参数和 hash 构建完整的 URL。
类型定义
buildUrl(path: string, query?: URLQuery, hash?: URLHash | ''): `/#123;string}`参数
| 参数 | 类型 | 说明 |
|---|---|---|
| path | string | 路由路径 |
| query | URLQuery | 查询参数,默认为 {} |
| hash | URLHash | '' | URL hash,默认为 '' |
返回值
| 类型 | 说明 |
|---|---|
`/${string}` | 完整的 URL 路径 |
示例
const url = router.buildUrl('/user', { id: '123' }, '#profile')
// hash 模式: /#/user?id=123#profile
// path 模式: /user?id=123#profilewaitViewRender()
等待视图渲染完成,包括异步组件解析和 DOM 更新。
类型定义
waitViewRender(navResult?: Promise<NavigateResult>): Promise<void>参数
| 参数 | 类型 | 说明 |
|---|---|---|
| navResult | Promise<NavigateResult> | 可选的导航结果 Promise(由 push()/replace() 返回) |
返回值
| 类型 | 说明 |
|---|---|
Promise<void> | 视图渲染完成后解析 |
示例
// 链式调用(推荐,性能更佳)
await router.waitViewRender(router.push('/foo'))
// 分步调用
await router.push('/foo')
await router.waitViewRender()
// 此时 DOM 已更新
console.log(document.querySelector('#app').innerHTML)resolveComponents()
解析当前路由匹配到的所有异步组件,确保它们加载完成。
类型定义
resolveComponents(route?: RouteLocation): Promise<void>参数
| 参数 | 类型 | 说明 |
|---|---|---|
| route | RouteLocation | 可选的路由位置,默认使用当前路由 |
返回值
| 类型 | 说明 |
|---|---|
Promise<void> | 所有组件加载完成后解析 |
详情
采用 Promise.allSettled 策略:即使部分组件加载失败,也不会阻断路由导航。组件加载的具体错误应由视图层捕获和处理。
install()
将路由器安装到 Vitarx 应用实例中,使组件可以通过 useRouter() 访问路由器。
类型定义
install(app: App): void参数
| 参数 | 类型 | 说明 |
|---|---|---|
| app | App | Vitarx 应用实例 |
示例
import { createApp } from 'vitarx'
import { createRouter } from 'vitarx-router'
import App from './App'
const router = createRouter({ routes: [...] })
const app = createApp(App).use(router)
app.mount('#root')