title: Nuxt.js 路由管理:useRouter 方法与路由中间件应用

date: 2024/7/28

updated: 2024/7/28

author: cmdragon

excerpt:

摘要:本文介绍了Nuxt 3中useRouter方法及其在路由管理和中间件应用中的功能。内容包括使用useRouter添加、移除路由,获取路由信息,基于History API的操作,导航守卫的实现,如定义匿名、命名及全局中间件,以及使用navigateTo和abortNavigation辅助函数。同时,还涉及Promise和错误处理,最后通过一个示例展示了useRouter的常见用法。

categories:

  • 前端开发

tags:

  • Nuxt.js
  • 路由管理
  • useRouter
  • 中间件
  • 前端开发
  • Vue.js
  • Web开发



扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

一、Nuxt 中的 useRouter 方法

useRouter 是 Nuxt 3 提供的一个用于处理路由的重要工具。它让您能够在应用中方便地进行各种路由操作。比如添加路由、导航、路由守卫等。

二、基本功能

  1. addRoute():向路由实例添加新的路由。您可以提供 parentName 将新路由添加为现有路由的子路由。 示例:
const router = useRouter();
router.addRoute({ name: 'newRoute', path: '/newPath', component: NewComponent });
  1. removeRoute():根据名称移除现有路由。 示例:
router.removeRoute('newRoute');

  1. getRoutes():获取所有路由记录的完整列表。 示例:
const routes = router.getRoutes();

  1. hasRoute():检查是否存在具有给定名称的路由。 示例:
const hasRoute = router.hasRoute('newRoute');

  1. resolve():返回路由位置的规范化版本,并包含一个 href 属性,其中包含任何现有的基础路径。 示例:
const resolvedRoute = router.resolve({ name: 'newRoute' });

三、基于 History API 的操作

  1. back():如果可能,返回上一页,与 router.go(-1) 相同。 示例:
router.back();

  1. forward():如果可能,前进到下一页,与 router.go(1) 相同。 示例:
router.forward();

  1. go():在历史记录中向前或向后移动,不受 router.back() 和 router.forward() 中施加的层次结构限制。 示例:
router.go(3);  // 向前移动 3 步

  1. push():通过将新条目推入历史堆栈来以编程方式导航到新的 URL。建议使用 navigateTo 代替。 示例:
router.push({ path: "/newUrl" });

  1. replace():通过替换当前路由历史堆栈中的当前条目来以编程方式导航到新的 URL。建议使用 navigateTo 代替。 示例:
router.replace({ hash: "#bio" });

四、导航守卫

定义中间件

  1. 匿名(或内联)中间件

    • 直接在页面的 definePageMeta 方法中定义。
    export default {
    pageMeta: {
    middleware: ['myMiddleware']
    }
    }
  2. 命名中间件

    • 放置在 middleware/ 目录下,并在页面中通过异步导入自动加载。
    // 在 `middleware/` 目录下创建文件
    export default defineNuxtRouteMiddleware((to, from) => {
    // 中间件逻辑
    })
  3. 全局中间件

    • 放置在 middleware/ 目录下,并以 .global 后缀结尾。
    // 在 `middleware/` 目录下创建文件
    export default defineNuxtRouteMiddleware((to, from) => {
    // 全局中间件逻辑
    })

使用辅助函数

Nuxt.js 提供了两个全局可用的辅助函数来处理导航:

  • navigateTo:用于重定向到给定的路由。

    return navigateTo('/new-route')
    
    
  • abortNavigation:用于中止当前的导航。

    return abortNavigation()
    
    

返回值

中间件返回的值决定了导航的行为:

  • :不阻止导航,将继续执行下一个中间件函数(如果有的话),或者完成路由导航。
  • navigateTo:重定向到给定的路径,并在服务器端发生重定向时设置重定向代码为 302 Found 或 301 Moved Permanently。
  • abortNavigation:停止当前的导航。
  • abortNavigation(error) :拒绝当前的导航并提供错误信息。

示例

假设我们有一个中间件用于检查用户是否登录,如果未登录则重定向到登录页面:

export default defineNuxtRouteMiddleware((to, from) => {
if (!userIsLoggedIn()) {
return navigateTo('/login')
}
})

注意事项

  • 避免无限循环:在重定向之前检查 to.path 是很重要的,否则可能会导致无限重定向循环。
  • 使用辅助函数:推荐使用 navigateTo 和 abortNavigation 辅助函数来执行重定向或停止导航,以确保与 Nuxt.js 的集成和未来的兼容性。
  • 了解变更风险:尽管 navigateTo 和 abortNavigation 辅助函数是推荐使用的,但其他在 vue-router 文档中描述的返回值可能也能工作。然而,未来 Nuxt.js 可能会对这些返回值进行更改,因此使用官方推荐的方法是最安全的。

五、Promise 和错误处理

  1. isReady():返回一个 Promise,在路由完成初始导航时解析。 示例:
const ready = await router.isReady();

  1. onError:添加一个错误处理程序,每次导航期间发生未捕获的错误时都会调用该处理程序。

六、示例应用

以下是一个简单的 Nuxt 3 应用示例,展示了如何使用 useRouter 的一些常见功能:

// pages/index.vue
<template>
<div>
<h1>Nuxt 3 Router Demo</h1>
<button @click="addNewRoute">Add New Route</button>
<button @click="removeRoute">Remove Route</button>
<button @click="goToNewUrl">Go to New URL</button>
</div>
</template> <script setup> const addNewRoute = () => {
router.addRoute({ name: 'newRoute', path: '/newPath', component: () => import('./NewComponent.vue') });
}; const removeRoute = () => {
router.removeRoute('newRoute');
}; const goToNewUrl = () => {
router.push({ path: '/newPath' });
};
</script>

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:Nuxt.js 路由管理:useRouter 方法与路由中间件应用 | cmdragon's Blog

往期文章归档:

Nuxt.js 路由管理:useRouter 方法与路由中间件应用的更多相关文章

  1. Nuxt.js开启SSR渲染快速入门

    第一节:nuxt.js相关概述 nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).Vue.js是开发SPA(单页应用)的,Nuxt.js这个框架,用Vue开发多 ...

  2. Nuxt.js 基础入门教程

    原文链接 Vue 开发一个单页面应用,相信很多前端工程师都已经学会了,但是单页面应用有一个致命的缺点,就是 SEO 极不友好.除非,vue 能在服务端渲染(ssr)并直接返回已经渲染好的页面,而并非只 ...

  3. [vue] vue服务端渲染nuxt.js

    初始化 使用脚手架工具 create-nuxt-app 快速创建 npx create-nuxt-app <项目名> npx create-nuxt-app 执行一些选择 在集成的服务器端 ...

  4. Nuxt.js学习(二) --- Nuxt目录结构详解、Nuxt常用配置项、Nuxt路由配置和参数传递

    [TOC] 1.Nuxt目录结构详解 Nuxt项目文件目录结构 |-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build |-- assets // 用于组织未编译的静态资源入LE ...

  5. Flutter中管理路由栈的方法和应用

    原文地址:https://www.jianshu.com/p/5df089d360e4 本文首先讲的Flutter中的路由,然后主要讲下Flutter中栈管理的几种方法. 了解下Route和Navig ...

  6. Vue.js路由管理器 Vue Router

    起步 HTML <script src="https://unpkg.com/vue/dist/vue.js"></script> <script s ...

  7. nuxt.js如何实现同级目录下建多个动态路由,并将链接设置.html后缀

    nuxt.js中如果在同级目录中建两个_xxxx.vue的动态路由文件,那么页面跳转始终是跳的一个页面,如何解决这个问题呢?下面举个栗子: 第一步:新建两个页面文件 第二步:在nuxt.config. ...

  8. nuxt.js同路由跳转参数不同,mounted不执行时

    watch: { '$route'(to, from) { if (to.fullPath !== from.fullPath) { this.$nextTick(() => { // 不加th ...

  9. vue路由管理-保留滚动位置功能、按需加载模块名自定义

    路由管理:保留滚动位置 其实现与组件的keep-alive相关,仅设置了keep-aive的页面,实施保留回退位置能力. keep-alive介绍 作用 把切换出去的组件保留在内存中,可以保留它的状态 ...

  10. WebApp中的页面生命周期及路由管理

    最近切换到一个新项目,使用的技术栈是Require+Backbone,鉴于对鞋厂webapp框架的了解,发现这个新项目有些缺陷,主要是单纯依赖Backbone造成的,也就是Backbone的好和坏都在 ...

随机推荐

  1. LlamaFS自组织文件管理器

    LlamaFS是一个自组织文件管理器.它可以基于文件内容和修改时间等属性自动重命名和组织您的文件.它能让你不把时间花在对文件的复制.粘贴.重命名.拷贝.排序等简单操作上.有幸在Github上看到Lla ...

  2. (八十八)c#Winform自定义控件-转子

    官网 http://www.hzhcontrols.com/ 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kw ...

  3. linux系统下,安装maven教程

    1.下载 官网:https://maven.apache.org/download.cgi 2.上传包 将下载好的maven安装包apache-maven-3.8.6-bin.tar.gz放在磁盘的 ...

  4. ES 关于 remote_cluster 的一记小坑

    最近有小伙伴找到我们说 Kibana 上添加不了 Remote Cluster,填完信息点 Save 直接跳回原界面了.具体页面,就和没添加前一样. 我们和小伙伴虽然隔着网线但还是进行了深入.详细的交 ...

  5. error pulling image configuration: Get https://eastasia.data.mcr.microsoft.com -- net/http: TLS handshake timeout

    error pulling image configuration: Get https://eastasia.data.mcr.microsoft.com/b29889755b1f4e46b6b44 ...

  6. 题目:SHMIP The subglacial hydrology model intercomparison Project

    SHMIP(冰下水文模型比较计划)是一个致力于解决冰下水文多种理论方法问题的项目.该计划通过构建一系列综合模拟实验,并对运行这些模拟的各参与模型的结果进行比较,以达到其目标.这将有助于潜在的模型用户更 ...

  7. Spring源码——ConfigurationClassPostProcessor类

    引言 Spring容器中提供很多方便的注解供我们在工作中使用,比如@Configuration注解,里面可以在方法上定义@Bean注解,将调用方法返回的对象交由Bean容器进行管理,那么Spring框 ...

  8. windows系统安装或使用inspect.exe工具

    确认是否安装? 结合工具everything,进行搜索 选择对应操作系统的版本,右键->选择打开路径,进到inspect.exe的安装路径,双击打开软件 软件开启后,就会自动开始抓取目前软件界面 ...

  9. substr()函数用法

    substr()函数: 定义和用法: substr()返回字符串的一部分 如果start参数是负数且length小于等于start,则length为0 语法: substr(starting,star ...

  10. vue3.4的更新,保证你看的明明白白

    defineModel 同学已经转正 defineModel 在vue3.3中还是一个实验性功能, 但是经过一个学期的努力,该同学已经转正. defineModel的简单介绍 defineModel( ...