路由
Nuxt3 路由配置与 Vue Router 3.0 基本一致,但有一些不同点
在 Nuxt3 中,路由配置文件是自动生成的,不需要手动配置
路由配置
在 pages 目录下新建路由文件,nuxt 会自动的引入所有文件生成路由配置,跳转的路径就是文件名称
bash
├── pages
│ ├── index.vue
│ ├── list.vue
- 使用
ts
const router = useRouter();
router.push("/");
router.push("/list");
嵌套路由
如果需要用到嵌套路由,则需创建一个与路由文件名称相同的文件夹,
如 home.vue 路由有嵌套路由,则创建一个同名的文件夹,在定义路由界面即可...
bash
├── pages
│ ├── index.vue
│ ├── home
│ │ ├── index.vue
│ │ ├── list.vue
- 使用
ts
const router = useRouter();
router.push("/home");
router.push("/home/list");
动态路由
文件以中括号命名
bash
├── pages
│ ├── posts
│ │ ├── index.vue
│ │ ├── [id].vue
- 使用
ts
const router = useRouter();
router.push("/posts");
router.push("/posts/1");
- 调用
html
<script setup>
// 接收参数
const route = useRoute();
console.log(route.params.id);
</script>
嵌套以中括号命令文件夹和文件
bash
├── pages
│ ├── [type]
│ │ ├── [id].vue
- 使用
html
<script setup>
// 传递两个参数
const router = useRouter();
router.push("/a/1");
router.push("/b/123");
</script>
- 调用
html
<script setup>
// 接收参数
const route = useRoute();
console.log(route.params.type, route.params.id);
</script>
文件夹和文件以中括号命令
bash
├── pages
│ ├── post-[type]
│ │ ├── [id].vue
- 使用
html
<script setup>
// 传递两个参数
const router = useRouter();
router.push("/posts-a/1");
router.push("/posts-b/123");
</script>
- 调用
ts
// 接收参数
const route = useRoute();
console.log(route.params.type, route.params.id);
文件以[....]命令
bash
├── pages
│ ├── posts
│ │ ├── [...].vue
- 使用
ts
// 此方式没有任何的参数限制
const router = useRouter();
router.push("/posts/a/1");
router.push("/posts/b/123");
router.push("/posts/b/123/32323");
- 调用
ts
// 接收参数
const route = useRoute();
console.log(route.params.all[0], route.params.all[1], route.params.all[2]);
路由跳转
组件跳转
html
<template>
<nav>
<ul>
<li><NuxtLink to="/">home</NuxtLink></li>
<li><NuxtLink to="/about">about</NuxtLink></li>
</ul>
</nav>
</template>
方法跳转
html
<script>
const router = useRouter();
router.push("/about");
</script>
路由参数
拼接
html
<script setup>
// 路由跳转
const router = useRouter();
router.push("/detail?id=123&name=hello");
</script>
<script setup>
// 接受参数
const route = useRoute();
console.log(route.query.id, route.query.name);
</script>
路由中间件
局部中间件
定义在 middleware 文件夹中,当页面每次使用时,会通过异步导入自动加载执行
bash
├── middleware
│ ├── auth.js
- 使用
auth.js
ts
export default defineNuxtRouteMiddleware((to, from) => {
console.log("要去那个页面:" + to.path);
console.log("来自那个页面:" + from.path);
});
- 页面里面调用
html
<script setup lang="ts">
definePageMeta({
middleware: "auth",
});
</script>
<template>
<h1>我是首页使用了路由中间件</h1>
</template>
全局中间件
必须定义在 middleware 文件夹中
必须使用.global.js 后缀
在每次路由变化时自动执行。
bash
├── middleware
│ ├── auth.global.js
- 使用
auth.global.js
ts
export default defineNuxtRouteMiddleware((to, from) => {
console.log("要去那个页面:" + to.path);
console.log("来自那个页面:" + from.path);
});
这样全局就能使用
路由验证(少)
这个可以写在中间件里面。也可以写在页面里
中间件里面就不做阐述了,下面是页面里
html
<script setup lang="ts">
definePageMeta({
validate: async (route) => {
// 检查id是否由数字组成
return /^\d+$/.test(route.params.id);
},
});
</script>