【vue3 路由使用与讲解】vue-router : 简洁直观的全面介绍
# 核心内容介绍
-
路由跳转有两种方式:
- 声明式导航:<router-link :to="...">
- 编程式导航:router.push(...) 或 router.replace(...) ;两者的规则完全一致。
-
push(to: RouteLocationRaw): Promise<NavigationFailure | void | undefined>
replace(to: RouteLocationRaw): Promise<NavigationFailure | void | undefined>;
-
- 由于属性
to与router.push接受的对象种类相同,所以两者的规则完全相同。
-
路由传参有两种方法:
- params:使用动态路由的方式进行传参;
- 只为了传参则不建议用params,params 主要是用来进行动态路由匹配的。
- 声明为动态路由,params则是必传的!除非设置为可选!
声明路由时设置该路由props参数为true,则会改变功能形态。(傻逼功能,别用)
- query:拼接在url后面,以?的方式隔开;/urlpath?d1="666"&d2=逆天&arr=["1"]&b=true
- 传参时仅建议 string | number | (string|number)[] 类型的数据 ,否则编辑器会 ts 报错提示。
- 所有传参的数据类型如果非字符串会自动字符串化 >> String(xx)
- params 和 query 的 TS 类型为:string | string[]。也就意味着它并不希望你放乱七八糟的东西在url上,即便你JSON.stringify() 转换过了。
- params:使用动态路由的方式进行传参;
-
动态路由:
- 动态路由的跳转必须是 name + params,用 path 跳转命名路由将无效;且 params 必传!
- 动态路由以 `/path1/:id` 的方式进行声明,跳转路径结果为 /path/1
- 动态路由设置的参数例如 :id ,可以将该参数设置为可选参数 `/path1/:id?` ,这样params就是可传可不传了。
-
命名路由:
- 就是声明了路由的 name。name值是唯一的,不管是顶级路由还是嵌套路由。
- 如果是跳转嵌套路由里的子路由,path 跳转需要/xx/xx/child,可直接用该子路由的name。
- 没有硬编码的 URL
params的自动编码/解码。- 防止你在 url 中出现打字错误。
- 绕过路径排序(如显示一个)
# 说明:
$route / route: 有当前路由的所有信息!
$router / router: 用来进行路由操作的!
# 声明路由
-
如何声明路由
- 必备的 path component。其他一堆属性自己了解相关功能就知道什么时候是必要的,什么时候是非必要的了。有用点的就是name redirect children meta了。
-
顶级路由
- 最外层的路由
-
嵌套路由
- 声明路由的 children
- 嵌套路由不限层级
- 想要默认加载一个子路由的话将path设置为空字符串:` path:"" `。
- 跳转嵌套路由最好使用 name 方式跳转,降低心智负担!
-
声明为动态路由,上面讲过了,忘了?别怕,那下面代码也有示例。
-
路由重定向
-
redirect: { name: 'routeName' }, 设置为路由的name最保险,别想着其他花里胡哨的。
-
在写 redirect 的时候,如果不是嵌套路由,可以省略 component 配置。
你重定向到自己的子路由,那肯定要有 component 啊,不然你 router-view 在哪(笑)
-
-
命名视图
-
component 变 components,具体看代码
-
-
本示例包含 path , name , meta , component , components , children , redirect , props , 路由懒加载 , alias 。
import { createRouter, createWebHistory } from 'vue-router'export const router = createRouter({history: createWebHistory(), // 设置路由模式routes: [{// 普通的设置一个普通的路由(顶级路由)path: '/',name: 'HelloWorld',meta: { requiresXXX: true }, // 设置路由元信息,应用场景的话:主要就路由守卫里用的会多一点。该数据只能在这里声明,其他途径无法修改。component: () => import('../components/HelloWorld.vue') // 设置路由懒加载},{path: '/routerVue/:id', // 设置为动态路由,id则必传// path: '/routerVue/:id?', // 设置该动态路由的 id 为可选参数,变为非必传name: 'routerVue',component: () => import('@/components/xxx.vue')},{path: '/demo',alias: '/hellow', // 你访问 /hellow,页面url路径会保持为/hellow,但是路由匹配则为/demo,显示 yyyyyy.vue 组件内容component: () => import('@/components/yyyyyy.vue')},{path: '/edit:id?',name: 'edit',// redirect: { name: 'profile' }, // 路由重定向,访问 /edit 直接重定向为 /edit/profilecomponent: () => import('../components/edit.vue'),props: true, // 设置为true 则在路由组件中,动态路由的参数 会直接放在vue的 props 里。 // 完全不推荐的写法,增加心智负担。children: [ // 设置为嵌套路由{// 当 /edit 匹配成功// demo2.vue 将被渲染到 edit 的 <router-view> 内部path: '', // 路径为'',需要增加name,不然会抛出警告。component: () => import('../components/demo2.vue'),// 命名视图功能: component 变为 components ,然后设置对应视图组件的名称// components:{ // 注意加 s 。。。// default: () => import('../components/router-test1.vue'),// template1: () => import('../components/router-test2.vue'),// },// props: {default: true , template1: false} // 可以为每个命名视图定义 props 配置。还可设置为函数模式(超不推荐,提高代码维护理解难度,对功能方面没任何提升)},{// 当 /edit/profile 匹配成功// demo.vue 将被渲染到 edit 的 <router-view> 内部path: 'profile',name: 'profile',component: () => import('../components/profile.vue'),}]},{// 匹配所有路径,当上述路径都不满足时,跳转到404页面// 如果项目是有动态添加路由的,注意一定要把该404路由提取出来,等动态添加完路由,再把404添加到动态路由的最后一个。path: '*',name: '404',component: () => import('../components/404.vue'),},],
})
# 路由跳转的多种写法:
声明式导航写法:
<router-link :to="{ name: 'vue33', params: { id: 110 }, query: { d1: 'wuwu~~~' } }">vue3.3/3.4新特性</router-link>
编程式导航写法:(options api里的方式)
this.$router.push({name: 'vue33',params: {id: 110},query: {data: 666}
})
编程式导航写法:(composition api里的方式)
import { useRouter } from 'vue-router'
let router = useRouter()
function tiaozhuan() {router.push({name: 'vue33',params: {id: 110},query: {data: 666}})
}
replace 是当前页面替换新页面,路由历史记录里不会保存当前页。
import { useRouter } from 'vue-router'
let router = useRouter()
function tiaozhuan() {router.replace({name: 'vue33',params: {id: 110},query: {data: 666}})
}
如果是嵌套路由则是父路由path + 子路由path,或者子路由的name,并且跳转时,如果父路由是命名路由,则params也会是必传!
# 获取路由参数
跳转目标路由,声明了params或query之后,(选项式api写法) 通过this.$route.params 或 this.$route.query 即可拿到对应的路由参数;
组合式API写法如下:
import { useRoute } from 'vue-router'let route = useRoute()console.log(route.params);
console.log(route.query);
console.log(route.meta);
# 重新提醒:
route: 有当前路由的所有信息
router: 用来进行路由操作的!
# 路由的导航守卫
- 全局守卫;
- beforeEach :全局前置守卫 (1)
- beforeResolve :全局解析守卫 (3)
- afterEach:全局后置钩子,该钩子在已经进入该路由后触发,所以无需return true 或 next()。 (4)
- 路由独享的守卫:
- beforeEnter :在所有组件内守卫和异步路由组件被解析之后调用。(2)
-
组件守卫:有3个,其中2个没屁用。
-
beforeRouteEnter :能处理的 beforeEnter 都可以。
-
beforeRouteUpdate :更没必要,直接 watch route.params 即可。
-
beforeRouteLeave :有点用,如果用户跳转路由时,当前页面编辑内容未保存,则可以 return false 取消路由跳转。(setup 内则手动引入 onBeforeRouteLeave)
-
-
触发顺序(1)(2)(3)(4)。
-
组件守卫其中2个懒得算,如果算上 beforeRouteLeave 那 beforeRouteLeave 排在beforeEach 前面。
-
每个守卫方法接收两个参数:
- to: 即将要进入的目标 。
- from: 当前导航正要离开的路由 。
- next: 可选的第三个参数 。(现在根据return 结果来决定了,且更安全(确保调用一次),所以基本不需要next了)
import { createRouter } from 'vue-router'
const router = createRouter({ ... })router.beforeEach((to, from) => {// ...return false // 返回 false 以取消导航// 如果什么都没有,undefined 或返回 true,则导航是有效的,并调用下一个导航守卫// return { name: 'Login' } // 将用户重定向到登录页面
})
# 动态添加路由
应用场景示例:页面菜单和所拥有的路由是根据用户角色动态生成的,此时就需要配合addRoute功能来实现需求。
//! 动态添加路由、删除路由、添加嵌套路由
router.addRoute({ path: '/about', component: xxx })// 当路由被删除时,所有的别名和子路由也会被同时删除
// 会返回一个回调,调用该函数即可删除路由 (这种方式可以保证删的更准点吧。。。)
const removeRoute = router.addRoute({ path: '/about', component: xxx })
removeRoute()
// router.removeRoute('about') 通过路由名称进行删除,路由表有同名的话需要注意点(建议路由表name都是唯一的!)// 添加嵌套路由
// router.addRoute({ name: 'admin', path: '/admin', component: Admin })
// router.addRoute('admin', { path: 'settings', component: AdminSettings })
//> 上述代码等同如如下:
// router.addRoute({
// name: 'admin',
// path: '/admin',
// component: Admin,
// children: [{ path: 'settings', component: AdminSettings }],
// })
# 查看现有路由
Vue Router 提供了两个功能来查看现有的路由:
- router.hasRoute():检查路由是否存在。
- router.getRoutes():获取一个包含所有路由记录的数组。
# 路由缓存、过渡
<router-view>、<keep-alive> 和 <transition>
transition 和 keep-alive 现在必须通过 v-slot API 在 RouterView 内部使用:
<router-view v-slot="{ Component }"><transition><keep-alive><component :is="Component" /></keep-alive></transition>
</router-view>
# 路由模式
- Hash 模式:createWebHashHistory
- HTML5 模式:createWebHistory
import { createRouter, createWebHashHistory } from 'vue-router'
const router = createRouter({history: createWebHashHistory(),routes: [//...],
})
html5模式需要在服务器上设置初次访问如果404时,进行路由回退:
nginx 如下:
location / {try_files $uri $uri/ /index.html;
}
其他的详见官网;
相关文章:
【vue3 路由使用与讲解】vue-router : 简洁直观的全面介绍
# 核心内容介绍 路由跳转有两种方式: 声明式导航:<router-link :to"...">编程式导航:router.push(...) 或 router.replace(...) ;两者的规则完全一致。 push(to: RouteLocationRaw): Promise<NavigationFailur…...
ubuntu创建账号和samba共享目录
新建用于登录Ubuntu图形界面的用户 sudo su #切换为root用户获取管理员权限用于新建用户 adduser username #新建用户(例如用户名为username) adduser username sudo #将用户添加到 sudo 组 新建只能用于命令行下登录的用户 sudo su #切换为root用户…...
李沐动手学习深度学习——3.6练习
本节直接实现了基于数学定义softmax运算的softmax函数。这可能会导致什么问题?提示:尝试计算exp(50)的大小。 可能存在超过计算机最大64位的存储,导致精度溢出,影响最终计算结果。 本节中的函数cross_entropy是根据交叉熵损失函数…...
机器学习_10、集成学习-Bagging(自举汇聚法)
Bagging(自举汇聚法) Bagging(Bootstrap Aggregating,自举汇聚法)是一种集成学习方法,由Leo Breiman于1996年提出。它旨在通过结合多个模型来提高单个预测模型的稳定性和准确性。Bagging方法特别适用于减少…...
【力扣hot100】刷题笔记Day20
前言 今天学习了一句话“自己如果不努力,屎都吃不上热乎的”,话糙理不糙,与君共勉 35. 搜索插入位置 - 力扣(LeetCode) 二分查找 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:n…...
Redis 之八:Jdeis API 的使用(Java 操作 Redis)
Jedis API 使用 Jedis 是 Redis 官方推荐的 Java 客户端,它提供了一套丰富的 API 来操作 Redis 服务器。通过 Jedis API,开发者可以方便地在 Java 应用程序中执行 Redis 的命令来实现数据的增删查改以及各种复杂的数据结构操作。 以下是一些基本的 Jedis…...
Docker 应用入门
一、Docker产生的意义 1‘解决环境配置难题:在软件开发中最大的麻烦事之一,就是环境配置。为了跑我们的程序需要装各种插件,操作系统差异、不同的版本插件都可能对程序产生影响。于是只能说:程序在我电脑上跑是正常的。 2’解决资…...
朱维群将出席用碳不排碳碳中和顶层科技路线设计开发
演讲嘉宾:朱维群 演讲题目:“用碳不排碳”碳中和顶层科技路线设计开发 简介 姓名:朱维群 性别:男 出生日期:1961-09-09 职称:教授 1998年毕业于大连理工大学精细化工国家重点实验室精细化工专业&#x…...
linux如何查看磁盘占用情况
要查看Linux系统中磁盘的占用情况,可以使用一些命令来获取相关信息。以下是一些常用的命令: df命令: df命令用于显示文件系统的磁盘空间使用情况,包括磁盘分区的总空间、已用空间、可用空间等信息。 df -h使用 -h 参数可以以人类可…...
【C++庖丁解牛】类与对象
📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.面向过程和面向对象…...
在什么时候企业档案才会发生调整
档案在企业中通常会调整在以下几个时刻: 1. 入职时:员工入职时,企业会要求员工提供个人档案,包括身份证件、学历证明、工作经历等相关文件。 2. 离职时:员工离职时,企业会整理员工的离职档案,包…...
Linux或Windows下判断socket连接状态
前言 场景:客户端程序需要实时知道和服务器的连接状态。比较通用的做法应用层是采用心跳机制,每隔一端时间发送心跳能回复说明服务器正常。 实际应用场景中,服务端和客户端并不是一家厂商的,比如说笔者这种情况,服务端…...
编译链接实战(25)gcc ASAN、MSAN检测内存越界、泄露、使用未初始化内存等内存相关错误
文章目录 1 ASAN1.1 介绍1.2 原理编译时插桩模块运行时库2 检测示例2.1 内存越界2.2 内存泄露内存泄露检测原理作用域外访问2.3 使用已经释放的内存2.4 将漏洞信息输出文件3 MSAN1 ASAN 1.1 介绍 -fsanitize=address是一个编译器选项,用于启用AddressSanitizer(地址...
[HackMyVM]靶场 VivifyTech
kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Unk…...
软考高级系统分析师:关联关系、依赖关系、实现关系和泛化关系概念和例题
一、AI 解读 关联关系、依赖关系、实现关系和泛化关系是面向对象设计中的四种基本关系。它们在类与类之间建立不同类型的联系,以反映对象间的相互作用、依赖和继承关系。下面我将使用表格的形式来解释这四种关系的概念和它们之间的区别: 关系类型概念特…...
设计模式学习笔记 - 面向对象 - 9.实践:如何进行面向对象分析、设计与编码
1.如何对接口鉴权这样一个功能开发做面向对象分析 本章会结合一个真实的案例,从基础的需求分析、职责划分、类的定义、交互、组装运行讲起,将最基础的面向对象分析(00A)、设计(00D)、编程(00P&…...
【iOS ARKit】RealityKit 同步机制
协作 Session 可以很方便地实现多用户之间的AR体验实时共享,但开发者需要自行负责并确保AR场景的完整性,自行负责虚拟物体的创建与销毁。为简化同步操作,RealityKit 内建了同步机制,RealityKit 同步机制基于 Multipeer Connectivi…...
【数据结构与算法】整数二分
问题描述 对一个排好序的数组,要求找到大于等于7的最小位置和小于等于7的最大位置 大于等于7的最小位置 易知从某个点开始到最右边的边界都满足条件,我们要找到这个区域的最左边的点。 开始二分! left指针指向最左边界,right…...
java项目打包运行报异常:xxxxx-1.0-SNAPSHOT.jar中没有主清单属性
pom.xml中加入这段话即可 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.4</version><executions><execution><…...
MAC-键盘command快捷键、设置windows快捷键
在 Windows PC 专用键盘上,请用 Alt 键代替 Option 键,用 Ctrl 键或 Windows 标志键代替 Command 键。 Mac 键盘快捷键 - 官方 Apple 支持 (中国) 设置windows快捷键 使用mac外接适用于windows的键盘时,如何设置快捷键?_mac外…...
ESP32实战指南:ADC连续采样与摇杆数据采集
1. ESP32 ADC连续采样基础解析 第一次接触ESP32的ADC功能时,我完全被各种专业术语搞晕了。后来在实际项目中反复调试才发现,理解ADC的关键在于抓住几个核心概念。ESP32-S3内置了两个12位SAR ADC(逐次逼近型模数转换器),…...
运动控制系统(五)-闭环的PI控制系统
上一节我们讲到控制系统的三大规律,第一条就是“比例控制系统无法消除“静差”。这一节我们解决这个问题。闭环积分控制在介绍静差的时候我们提到了:静差的存在主要是因为比例控制器仅依赖于当前误差ΔUn来进行调节,而没有考虑过去࿰…...
工业视觉光源频闪同步:三种主流触发模式的实战选型与调优
1. 工业视觉光源频闪同步的核心价值 在高速产线飞拍、精密装配检测等工业视觉场景中,光源频闪同步技术就像给高速运动的物体按下"暂停键"。想象一下拍摄飞驰的子弹——如果使用普通连续光,照片上只会得到一条模糊的轨迹;而采用精准…...
索托拉西布治疗KRAS G12C突变NSCLC,ORR达37.1%,中位DOR 11.1个月
在非小细胞肺癌(NSCLC)的治疗领域,KRAS G12C突变曾是一块难以攻克的“坚冰”。传统治疗方案对于携带这一突变的患者效果有限,患者往往面临着疾病快速进展和生存期短的困境。然而,索托拉西布的出现为这部分患者带来了新…...
终极魔兽争霸3兼容性工具:5大核心功能全面优化游戏体验
终极魔兽争霸3兼容性工具:5大核心功能全面优化游戏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3兼容性工具WarcraftHelpe…...
大语言模型作为语种民族文明压缩镜像的映射特性分析
摘要 大语言模型通过预测下一个词学习语言概率模式的本质,使其成为其所训练语料库的统计压缩体。这种本质决定了模型能够映射特定语种民族或文明的深层文化偏好,成为一个独特的“压缩镜像”。该镜像并非对文明的完整复制,而是基于海量文本数据…...
超详细IPsec的真实案例(简化),总部和分支和地级市互通
1.实验拓扑2.基本配置(为了方便)a.基础配置(IP地址,路由等)AR1:# interface GigabitEthernet0/0/0ip address 192.168.1.254 255.255.255.0 # interface GigabitEthernet0/0/1ip address 10.1.13.1 255.25…...
别再只画静态图了!用Qt QChart实现可交互波形图的5个高级技巧
别再只画静态图了!用Qt QChart实现可交互波形图的5个高级技巧 在数据可视化领域,静态图表已经无法满足现代应用对用户体验的严苛要求。想象一下,当用户面对一个温度监测系统时,如果只能被动地观看一条固定不变的曲线,而…...
保姆级教程:手把手教你为ROS机器人定制Rviz多目标点导航插件(基于move_base)
从零构建ROS机器人专属Rviz导航插件:多目标点顺序导航实战指南 当你的ROS机器人需要在复杂环境中执行多点位任务时,一个可靠的多目标点导航插件能极大提升工作效率。本文将带你深入理解Rviz插件机制,并手把手教你如何基于开源代码定制适配自己…...
基于PID的四旋翼无人机轨迹跟踪控制 0. 直接运行simulink仿真文件.slx 1
基于PID的四旋翼无人机轨迹跟踪控制0. 直接运行simulink仿真文件.slx 1. 如果出现文件或变量不能识别的警告或错误,建议将文件夹添加到matlab搜索路径以检索到所需文件,或者进入到最里层文件夹运行程序。 2. 如果想去掉simulink模块的封面图(…...
