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>
```
相关推荐
27669582921 分钟前
京东e卡滑块 分析
java·javascript·python·node.js·go·滑块·京东
爱写代码的刚子3 分钟前
C++知识总结
java·开发语言·c++
martian6653 分钟前
QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
开发语言·qt
golitter.6 分钟前
Ajax和axios简单用法
前端·ajax·okhttp
冷琴199610 分钟前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot
PleaSure乐事16 分钟前
【Node.js】内置模块FileSystem的保姆级入门讲解
javascript·node.js·es6·filesystem
缘友一世18 分钟前
macOS .bash_profile配置文件优化记录
开发语言·macos·bash
tekin21 分钟前
macos 中使用macport安装,配置,切换多版本php,使用port 安装php扩展方法总结
开发语言·macos·php·port·mac多版本php安装管理·port-select
雷特IT26 分钟前
Uncaught TypeError: 0 is not a function的解决方法
前端·javascript
CSXB9930 分钟前
一、Python(介绍、环境搭建)
开发语言·python·测试工具·集成测试