nuxt3 路由相关

普通路由

Nuxt没有router.js,会自动为 ~/pages/ 目录中的每个页面创建一个路由

JavaScript 复制代码
-| pages/
---| parent/
------| child.vue
---| parent.vue
JavaScript 复制代码
[
  {
    path: '/parent',
    component: '~/pages/parent.vue',
    name: 'parent',
    children: [
      {
        path: 'child',
        component: '~/pages/parent/child.vue',
        name: 'parent-child'
      }
    ]
  }
]

路由信息

想为路由中添加信息,可使用以下方法

JavaScript 复制代码
<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

JavaScript 复制代码
-| pages/
---| users-[group]/
-----| [id].vue

在页面中,可以用params获取

JavaScript 复制代码
<script setup>
  const route = useRoute()
  console.log(route.params.group) // admins
  console.log(route.params.id) // 123
</script>

全覆盖路由

[...slug].vue会匹配该路径下的所有路由

下边页面结构生成的路由是/users/{slug},如/users/123

JavaScript 复制代码
-| pages/
---| users/
-----| [...slug].vue

在页面中,可以用params获取

JavaScript 复制代码
<script setup>
  const route = useRoute()
  console.log(route.params.slug) // 123
</script>

路由重定向

JavaScript 复制代码
<script setup>
definePageMeta({
  redirect: '/home'
})
</script>

自定义路由(vueRouter风格)

Nuxt 3提供了 pages:extend 钩子,允许完全更改Nuxt自动生成的路由,我们可以通过该钩子实现vue-router路由方案(适合老项目迁移,并不是很推荐这样用)

  1. 首先创建router/index.ts文件

    JavaScript 复制代码
    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;
  2. 创建钩子函数

    JavaScript 复制代码
    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实现的

  1. 创建中间件文件夹middleware(和pages同级)

  2. 在middleware文件夹中创建文件'xxx.ts'

    JavaScript 复制代码
    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全局守卫

JavaScript 复制代码
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>
```
相关推荐
代码匠心7 分钟前
AI 自动编程:一句话设计高颜值博客
前端·ai·ai编程·claude
_AaronWong1 小时前
Electron 实现仿豆包划词取词功能:从 AI 生成到落地踩坑记
前端·javascript·vue.js
cxxcode1 小时前
I/O 多路复用:从浏览器到 Linux 内核
前端
用户5433081441941 小时前
AI 时代,前端逆向的门槛已经低到离谱 — 以 Upwork 为例
前端
JarvanMo2 小时前
Flutter 版本的 material_ui 已经上架 pub.dev 啦!快来抢先体验吧。
前端
JohnYan2 小时前
工作笔记-CodeBuddy应用探索
javascript·ai编程·aiops
恋猫de小郭2 小时前
AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?
前端·人工智能·ai编程
哀木2 小时前
给自己整一个 claude code,解锁编程新姿势
前端
程序员鱼皮2 小时前
GitHub 关注突破 2w,我总结了 10 个涨星涨粉技巧!
前端·后端·github
UrbanJazzerati2 小时前
Vue3 父子组件通信完全指南
前端·面试