Nuxt.js 路由管理:useRouter 方法与路由中间件应用
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 提供的一个用于处理路由的重要工具。它让您能够在应用中方便地进行各种路由操作。比如添加路由、导航、路由守卫等。
二、基本功能
addRoute():向路由实例添加新的路由。您可以提供parentName将新路由添加为现有路由的子路由。 示例:
const router = useRouter();
router.addRoute({ name: 'newRoute', path: '/newPath', component: NewComponent });
removeRoute():根据名称移除现有路由。 示例:
router.removeRoute('newRoute');
getRoutes():获取所有路由记录的完整列表。 示例:
const routes = router.getRoutes();
hasRoute():检查是否存在具有给定名称的路由。 示例:
const hasRoute = router.hasRoute('newRoute');
resolve():返回路由位置的规范化版本,并包含一个href属性,其中包含任何现有的基础路径。 示例:
const resolvedRoute = router.resolve({ name: 'newRoute' });
三、基于 History API 的操作
back():如果可能,返回上一页,与router.go(-1)相同。 示例:
router.back();
forward():如果可能,前进到下一页,与router.go(1)相同。 示例:
router.forward();
go():在历史记录中向前或向后移动,不受router.back()和router.forward()中施加的层次结构限制。 示例:
router.go(3); // 向前移动 3 步
push():通过将新条目推入历史堆栈来以编程方式导航到新的 URL。建议使用navigateTo代替。 示例:
router.push({ path: "/newUrl" });
replace():通过替换当前路由历史堆栈中的当前条目来以编程方式导航到新的 URL。建议使用navigateTo代替。 示例:
router.replace({ hash: "#bio" });
四、导航守卫
定义中间件
匿名(或内联)中间件:
- 直接在页面的
definePageMeta方法中定义。
export default {
pageMeta: {
middleware: ['myMiddleware']
}
}- 直接在页面的
命名中间件:
- 放置在
middleware/目录下,并在页面中通过异步导入自动加载。
// 在 `middleware/` 目录下创建文件
export default defineNuxtRouteMiddleware((to, from) => {
// 中间件逻辑
})- 放置在
全局中间件:
- 放置在
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 和错误处理
isReady():返回一个Promise,在路由完成初始导航时解析。 示例:
const ready = await router.isReady();
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
往期文章归档:
- useRoute 函数的详细介绍与使用示例 | cmdragon's Blog
- 使用 useRequestURL 组合函数访问请求URL | cmdragon's Blog
- Nuxt.js 环境变量配置与使用 | cmdragon's Blog
- 服务端渲染中的数据获取:结合 useRequestHeaders 与 useFetch | cmdragon's Blog
- 使用 useRequestEvent Hook 访问请求事件 | cmdragon's Blog
- 使用 useNuxtData 进行高效的数据获取与管理 | cmdragon's Blog
- Nuxt 3 使用指南:掌握 useNuxtApp 和运行时上下文 | cmdragon's Blog
- 使用 useLazyFetch 进行异步数据获取 | cmdragon's Blog
- 使用 useLazyAsyncData 提升数据加载体验 | cmdragon's Blog
- Nuxt.js 中使用 useHydration 实现数据水合与同步 | cmdragon's Blog
- useHeadSafe:安全生成HTML头部元素 | cmdragon's Blog
- Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验 | cmdragon's Blog
- 探索Nuxt.js的useFetch:高效数据获取与处理指南 | cmdragon's Blog
- Nuxt.js 错误侦探:useError 组合函数 | cmdragon's Blog
- useCookie函数:管理SSR环境下的Cookie | cmdragon's Blog
- 轻松掌握useAsyncData获取异步数据 | cmdragon's Blog
- 使用
useAppConfig:轻松管理应用配置 | cmdragon's Blog
Nuxt.js 路由管理:useRouter 方法与路由中间件应用的更多相关文章
- Nuxt.js开启SSR渲染快速入门
第一节:nuxt.js相关概述 nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).Vue.js是开发SPA(单页应用)的,Nuxt.js这个框架,用Vue开发多 ...
- Nuxt.js 基础入门教程
原文链接 Vue 开发一个单页面应用,相信很多前端工程师都已经学会了,但是单页面应用有一个致命的缺点,就是 SEO 极不友好.除非,vue 能在服务端渲染(ssr)并直接返回已经渲染好的页面,而并非只 ...
- [vue] vue服务端渲染nuxt.js
初始化 使用脚手架工具 create-nuxt-app 快速创建 npx create-nuxt-app <项目名> npx create-nuxt-app 执行一些选择 在集成的服务器端 ...
- Nuxt.js学习(二) --- Nuxt目录结构详解、Nuxt常用配置项、Nuxt路由配置和参数传递
[TOC] 1.Nuxt目录结构详解 Nuxt项目文件目录结构 |-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build |-- assets // 用于组织未编译的静态资源入LE ...
- Flutter中管理路由栈的方法和应用
原文地址:https://www.jianshu.com/p/5df089d360e4 本文首先讲的Flutter中的路由,然后主要讲下Flutter中栈管理的几种方法. 了解下Route和Navig ...
- Vue.js路由管理器 Vue Router
起步 HTML <script src="https://unpkg.com/vue/dist/vue.js"></script> <script s ...
- nuxt.js如何实现同级目录下建多个动态路由,并将链接设置.html后缀
nuxt.js中如果在同级目录中建两个_xxxx.vue的动态路由文件,那么页面跳转始终是跳的一个页面,如何解决这个问题呢?下面举个栗子: 第一步:新建两个页面文件 第二步:在nuxt.config. ...
- nuxt.js同路由跳转参数不同,mounted不执行时
watch: { '$route'(to, from) { if (to.fullPath !== from.fullPath) { this.$nextTick(() => { // 不加th ...
- vue路由管理-保留滚动位置功能、按需加载模块名自定义
路由管理:保留滚动位置 其实现与组件的keep-alive相关,仅设置了keep-aive的页面,实施保留回退位置能力. keep-alive介绍 作用 把切换出去的组件保留在内存中,可以保留它的状态 ...
- WebApp中的页面生命周期及路由管理
最近切换到一个新项目,使用的技术栈是Require+Backbone,鉴于对鞋厂webapp框架的了解,发现这个新项目有些缺陷,主要是单纯依赖Backbone造成的,也就是Backbone的好和坏都在 ...
随机推荐
- Flutter(四):Flutter 语言 Dart基础使用
一.变量和常量 变量 var a = 1; var str = 'abc'; 常量 const PI = 3.14; 不可变对象 final PI = 3.14; final TIME = new D ...
- RCTF 2024 WEB wp
RCTF 2024 WEB wp 前言 赛后复现,proxy发现自己真是个呆b... what_is_love 首先拿key1,sql语句处有注入,可以盲注拿key1的值 import request ...
- docker资源限制与数据持久化
1. docker简介和核心概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全使 ...
- LeetCode 719. 找出第 k 小的距离对 (Java)
题目: 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入:nums = [1,3,1]k = 1输出:0 解释 ...
- kettle从入门到精通 第六十课 ETL之kettle for循环处理每条数据,so easy!
1.kettle原生是支持for循环处理的,无需通过javascript脚本或者java脚本开发for循环控制.当然如果想通过脚本挑战下也是可以的. 本节课主要讲解如何通过kettle中的job来实现 ...
- kettle从入门到精通 第十二课 kettle java代码过滤记录、利用Janino计算Java表达式
1.下图通过简单的示例讲解了根据java代码过滤记录和利用Janino计算Java表达式两个组件. 2.根据java代码过滤记录 1)步骤名称:自定义 2)接收匹配的行的步骤(可选):下面条件(jav ...
- Maven 指令 mvn:dependency:tree 查看依赖
一.指令指导文档: 官方文档:https://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html https://maven ...
- 阿里云OSS图片上传和显示注意点
1. java.lang.IllegalArgumentException: The object key "/image-业务名称/20230818/20230818-订单号参数-acci ...
- Java面试知识点(四)重写和重载
重写override 在 java 中有很多的继承,继承下来的有变量.方法.在有一些子类要实现的方法中,方法名.传的参数.返回值跟父类中的方法一样,但具体实现又跟父类的不一样,这时候我们就需要重写父类 ...
- Project Euler 1~10 野蛮题解
这些题都比较简单就不贴代码和做法了 23333333 具体到做法就是枚举暴力,这十题中可能难一点地方的就是筛质数表,可以学习一下 Eratosthenes 筛法或者是欧拉筛. 如果您不会前十题建议好好 ...