当前位置: 首页 > news >正文

Vue:路由管理vue-router

Vue Router 是 Vue 官方的客户端路由解决方案,可以通过配置路由来告诉 Vue Router 为每个 URL 路径显示哪些组件。

1. Vue3 中使用 vue-router


安装

npm install vue-router@4

创建路由配置文件

新建 router/index.js 文件按用来统一管理路由配置。

// router/index.js
import { createRouter, createWebHistory } from "vue-router";const router = createRouter({history: createWebHistory(),routes: [{path: '/',component: () => import("@/views/Home"),},{path: '/user',component: () => import("@/views/User"),}]
})export default router;

在 main.js 中注册路由

// main.jsimport { createApp } from 'vue'
import router from './router'
import App from './app.vue'const app = createApp(App)
app.use(router).mount('#app')

在组件中使用路由

<!-- App.vue -->
<template><nav><router-link to="/">首页</router-link><router-link to="/user">用户</router-link></nav><main><router-view /></main></template>

2. 路由配置


动态路由匹配

// router/index.jsconst routes = [{path: '/user/:id',component: User,}
]

路径参数用冒号 : 表示。当一个路由被匹配时(/user/123),它的 params 的值可以使用 useRoute() 钩子函数获取。

<!-- User.vue -->
<script setup>
import { useRoute } from 'vue-router'const route = useRoute();
console.log(route.params);		// {id: 123}
</script>

使用带有参数的路由时需要注意的是,当用户从 /users/122 导航到 /users/123 时,相同的组件实例将被重复使用,从而组件的生命周期钩子不会被调用。

要对同一个组件中参数的变化做出响应的话,可以使用 watch 监听 route.params。

嵌套路由

const routes = [{path: '/user/:id',component: User,children: [{        path: '',				// 当 /user/:id 匹配成功component: UserHome,	// UserHome 将被渲染到 User 的 <router-view> 内部},{        path: 'posts',			// 当 /user/:id/posts 匹配成功component: UserPosts,	// UserPosts 将被渲染到 User 的 <router-view> 内部},],},
]

注意:子路由的 path 属性中不可以带 /,否则无法匹配。

<!-- User.vue -->
<template><div>{{ route.params.id }}</div><router-view />
</template>

3. 路由导航


<script setup>
import { useRouter } from 'vue-router'const router = useRouter()
router.push()		// 导航
router.replace()	// 替换
router.go(1)		// 返回上一条记录
</script>

传参

const username = 'eduardo'router.push(`/user/${username}`) 		// -> /user/eduardorouter.push({ path: `/user/${username}` }) 	// -> /user/eduardo// 命名路由
router.push({ name: 'user', params: { username } }) 	// -> /user/eduardo// `params` 不能与 `path` 一起使用
router.push({ path: '/user', params: { username } }) 	// -> /user// 带查询参数
router.push({ path: '/user', query: { username } })		// -> /user?username=eduardo

4. 导航守卫

vue-router 提供的导航守卫主要用于在路由导航过程中添加一些额外的逻辑,如权限验证、数据获取等。它允许你在路由发生变化的不同阶段插入自定义的代码片段,从而控制路由的跳转和取消。

全局前置守卫

router.beforeEach 用于在路由跳转前执行一些逻辑,例如身份验证。当一个导航触发时,全局前置守卫按照创建顺序调用。

// router/index.js
const router = createRouter({ ... })router.beforeEach(async (to, from) => {if (!isAuthenticated && to.path !== '/login'){return '/login'				// 检查用户是否已登录,否则重定向到登录页面}
})
  • 参数
    • to:即将要进入的目标
    • from:当前导航正要离开的路由
  • 返回值
    • false:取消当前的跳转
    • 路由地址:跳转到指定路由
    • 不返回或返回 true / undefined:进行默认导航

全局解析守卫

router.beforeResolve 在导航被确认之前、所有组件内守卫和异步路由组件被解析之后调用。适用于在组件渲染之前获取必要的数据。例如,你可能想要根据路由参数从服务器获取数据,并在组件渲染之前将数据传递给组件。

全局后置钩子

router.afterEach 在导航完成后触发。它不改变导航本身,不能取消或重定向导航,而通常用于执行一些与导航结果相关的操作,如追踪、分析或调试。例如,你可以在这里记录页面访问统计信息。

相关文章:

  • 信息标记形式 (XML, JSON, YAML)
  • DeepFace ——用于高级人脸识别算法探索与应用
  • 【Python】Python异步编程
  • FFmpeg 中 Filters 使用文档介绍
  • 纯网络的系统能否定级备案?
  • 易基因:RNA免疫共沉淀测序 (RIP-seq) 技术介绍
  • 【Java数据结构】详解Stack与Queue(二)
  • MTK 平台项目security boot 开启/关闭 及 系统签名流程
  • autowired注解底层实现代码
  • Ant Design Vue Pro流程分析记录
  • JMeter源码解析之SplashScreen.java
  • [每日一题]170:分糖果 II
  • 今日好料推荐(ARM嵌入式)
  • chatgpt4和文心一言的简单对比
  • 某红书旋转滑块验证码分析与协议算法实现(高通过率)
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【RocksDB】TransactionDB源码分析
  • Angular Elements 及其运作原理
  • canvas 五子棋游戏
  • Docker容器管理
  • IDEA 插件开发入门教程
  • Iterator 和 for...of 循环
  • Java比较器对数组,集合排序
  • Java知识点总结(JavaIO-打印流)
  • js作用域和this的理解
  • k8s 面向应用开发者的基础命令
  • Netty 4.1 源代码学习:线程模型
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • vue--为什么data属性必须是一个函数
  • 不上全站https的网站你们就等着被恶心死吧
  • 番外篇1:在Windows环境下安装JDK
  • 给第三方使用接口的 URL 签名实现
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 前端之Sass/Scss实战笔记
  • 悄悄地说一个bug
  • 深入浅出Node.js
  • 我这样减少了26.5M Java内存!
  • ​​​【收录 Hello 算法】9.4 小结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #13 yum、编译安装与sed命令的使用
  • #QT 笔记一
  • #Z0458. 树的中心2
  • #每天一道面试题# 什么是MySQL的回表查询
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C++)八皇后问题
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (十) 初识 Docker file
  • (十一)c52学习之旅-动态数码管
  • (算法)N皇后问题
  • (未解决)macOS matplotlib 中文是方框
  • (源码分析)springsecurity认证授权