Nuxt 3 使用基于文件系统的自动路由生成机制,开发者通过 pages/
目录结构即可自动生成 Vue Router 路由。它支持:
navigateTo
与 router.push
pages/index.vue
/
pages/about.vue
/about
pages/users/index.vue
/users
pages/users/profile.vue
/users/profile
[param]
pages/users/[id].vue
→ /users/:id
[[param]]
pages/users/[[id]].vue
→ /users
或 /users/:id
[...param]
(Catch-all)pages/docs/[...slug].vue
→ /docs/a/b
[[...param]]
pages/docs/[[...slug]].vue
→ /docs
或 /docs/a/b
⚠️
[...param]
和[[...param]]
返回数组,如['a', 'b']
pages/
└── users/
├── index.vue -> /users
├── [id].vue -> /users/:id
用户中心
pages/users/profile.vue
自动生成:name: 'users-profile'
definePageMeta({
name: 'customUserProfile'
})
跳转:
navigateTo({ name: 'customUserProfile', params: { id: 1 } })
await navigateTo('/about')
const router = useRouter()
router.push('/about')
方法 | SSR 支持 | 推荐使用 | 说明 |
---|---|---|---|
navigateTo | ✅ | ✅ | Nuxt 内置推荐 |
router.push | ❌ | ❌ | Vue Router 原生 |
// middleware/auth.global.ts
export default defineNuxtRouteMiddleware(() => {
if (!isAuthenticated()) {
return navigateTo('/login')
}
})
definePageMeta({
middleware: 'auth'
})
definePageMeta({
middleware: ['auth', 'log']
})
// nuxt.config.ts
export default defineNuxtConfig({
pages: false
})
// app/router.options.ts
export const routes = [
{
path: '/custom',
name: 'custom',
component: () => import('@/pages/custom.vue')
}
]
[[param]]
与其他页面冲突pages/users/
├── [[id]].vue
├── profile.vue
/users/profile
时被 [[id]]
捕获pages/users/
├── index.vue
├── [id].vue
├── profile.vue
[[...slug]]
与静态路由冲突pages/docs/
├── [[...slug]].vue
├── create.vue
/docs/create
被误认为 slug 参数pages/docs/
├── create.vue # 静态优先
├── [...slug].vue # 放后处理动态
pages/blog/
├── [id].vue
├── [category].vue
/blog/vue
无法明确匹配哪个参数pages/blog/
├── category/[name].vue
├── [id].vue
类型 | 文件结构 / 语法 | 对应路径示例 | 说明 |
---|---|---|---|
静态路由 | pages/about.vue |
/about |
文件即路由 |
嵌套路由 | pages/users/index.vue |
/users |
子目录作为子路径 |
动态参数 | [id].vue |
/users/1 |
单个参数匹配 |
可选参数 | [[id]].vue |
/users 或 /users/1 |
参数可传可不传 |
嵌套参数 | [...slug].vue |
/docs/a/b/c |
多段路径匹配为数组 |
可选嵌套参数 | [[...slug]].vue |
/docs 或 /docs/a/b |
可选多段路径匹配 |
命名路由 | definePageMeta({ name }) |
{ name: 'xxx' } |
用于编程式跳转 |
navigateTo | navigateTo('/home') |
SSR 兼容跳转 | 推荐 |
router.push | router.push('/home') |
仅客户端跳转 | 不推荐 SSR |
路由中间件 | middleware/*.ts + meta |
页面权限控制 | 支持全局/局部 |
路由冲突 | [[]] 与其他路由、[…slug] |
多路径匹配混用时注意 | 应避免命名冲突或错配 |