Nuxt没有router.js,会自动为 ~/pages/
目录中的每个页面创建一个路由
如
-| pages/
---| parent/
------| child.vue
---| parent.vue
[
{
path: '/parent',
component: '~/pages/parent.vue',
name: 'parent',
children: [
{
path: 'child',
component: '~/pages/parent/child.vue',
name: 'parent-child'
}
]
}
]
想为路由中添加信息,可使用以下方法
<script setup lang="ts">
definePageMeta({
title: 'My home page',
a: 'aaa',
b: 'bbb',
})
</script>
注:definePageMeta
方法中除了validate、redirect、name、path、alias、pageTransition、layoutTransition、key、keepalive、layout、middleware、scrollToTop
以外的字段都会被放入route.meta
中
下边页面结构生成的路由是/users-{group}/{id}
,如/users-admins/123
-| pages/
---| users-[group]/
-----| [id].vue
在页面中,可以用params
获取
<script setup>
const route = useRoute()
console.log(route.params.group) // admins
console.log(route.params.id) // 123
</script>
[...slug].vue
会匹配该路径下的所有路由
下边页面结构生成的路由是/users/{slug}
,如/users/123
-| pages/
---| users/
-----| [...slug].vue
在页面中,可以用params
获取
<script setup>
const route = useRoute()
console.log(route.params.slug) // 123
</script>
<script setup>
definePageMeta({
redirect: '/home'
})
</script>
Nuxt 3提供了 pages:extend
钩子,允许完全更改Nuxt自动生成的路由,我们可以通过该钩子实现vue-router路由方案(适合老项目迁移,并不是很推荐这样用)
首先创建router/index.ts
文件
import type { NuxtPage } from "nuxt/schema";
import routerList from "./module/index";
const path = require("path");
const childrenRouter: NuxtPage[] = [
{
path: "",
name: "home",
file: path.resolve("pages/home/index.vue"),
meta: {
aaa: 'aaa',
bbb: 'bbb',
}
},
...
]
export default router;
创建钩子函数
import router from "./router/index";
export default defineNuxtConfig({
hooks: {
"pages:extend": (routes) => {
// 清空Nuxt.js自动生成的路由
routes.splice(0);
// // 重新将自定义路由配置设置进去
routes.push(...(router as NuxtPage[]));
},
},
})
推荐使用
middleware
实现路由钩子,如果不想使用,plugins
+useRouter().beforeEach
也可以模拟出同样的效果
middleware
路由钩子实际是通过middleware实现的
创建中间件文件夹middleware(和pages同级)
在middleware文件夹中创建文件’xxx.ts’
export default defineNuxtRouteMiddleware(async (to, from) => {
if (process.server) {...}; // 服务端执行的操作
if (process.client) {...}; // 客户端执行的操作
...
if (to.name === 'home') return navigateTo('/index');
return;
})
middleware默认在服务器和浏览器中都会执行一遍
if (process.server) {...}
服务器中执行
if (process.client) {...}
浏览器中执行
abortNavigation()
阻止导航继续前进
return navigateTo(xxx)
跳转到该路由(注意要return)
plugins
+useRouter().beforeEach
通过插件(plugins)注册beforeEach实现
Nuxt提供的useRouter
函数(SSR友好)中,可以配置beforeEach
,可以通过插件注入的形式来添加beforeEach
全局守卫
export default defineNuxtPlugin((nuxtApp) => {
const router = useRouter();
router.beforeEach(async (to, from, next) => {
if (process.server) {...}; // 服务端执行的操作
if (process.client) {...}; // 客户端执行的操作
...
next()
}
})
如果文件名中带有“.global.”,则该文件为**全局中间件**,如“xxx.global.ts”
1. 全局中间件创建后会自动执行
2. 非全局中间件,需要在对应的页面中注册才可使用
```Plain Text
<script setup lang="ts">
definePageMeta({
middleware: ["auth"] // middleware->auth.ts
})
</script>
```