Vue3.0路由拦截
全局路由器拦截:官方叫导航守卫
index.js路由器
import { createRouter, createWebHistory } from "vue-router"; //导入vue-router路由模块,createWebHashHistor函数const routes = [{path: "/", //路径: redirect: "/Films" //涉及到多级页面跳转需要用路径的跳转,不能用name的跳转; 浏览器进入http://localhost:5173/ 首先要跳转的路径是/Films,即:要跳转到http://localhost:5173/Films,而进入http://localhost:5173/Films后又发现/Films要重定向到/Films/NowPlaying,这样就实现了打开http://localhost:5173/就加载出来了http://localhost:5173/Films/NowPlaying内容// redirect: {// name: "Films" //重定向到路由名称为Tabbar的路由中,这样当浏览器输入的是:http://localhost:5173/ 则会重定向跳转到 http://localhost:5173/Films// }},{path: "/Navbar", //路径:导航栏name: "Navbar",//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。component: () => import("../views/Navbar.vue")},{path: "/FilmsDetail/:myid/:myname", //路径:电影内容详细 "/FilmsDetail/:myid"的意思是:当路由以/FilmsDetail/为开头那么它后面的就是myid参数:举列:http://localhost:5173/FilmsDetail/123 那么这个123就是myid参数; 如果存在两个参数呢?"/FilmsDetail/:myid/:myname" 举列:http://localhost:5173/FilmsDetail/123/lily 那么这个123就是myid参数,lily就是myname参数name: "FilmsDetail", //路由名称,如果不指定name 默认的name为default//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。component: () => import("../views/FilmsDetail.vue")},{path: "/Tabbar", //路径:底部选项卡name: "Tabbar", //路由名称,如果不指定name 默认的name为default//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。component: () => import("../views/Tabbar.vue"),},{path: "/Films", //路径:电影name: "Films", //路由名称,如果不指定name 默认的name为default//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。component: () => import("../views/Films.vue"),children: [ //通过children配置子级路由{path: 'NowPlaying', //可以写成:'/Films/NowPlaying' 但是不要写成 '/NowPlaying'(正在热映)name: "NowPlaying",component: () => import("../views/NowPlaying.vue")},{path: 'ComingSoon', //可以写成:'/Films/ComingSoon' 但是不要写成 '/ComingSoon'(即将上映)component: () => import("../views/ComingSoon.vue")},{//为什么在子路由中添加一个Films路由?:答:因为在进入Films组件后就需要立即加载NowPlaying组件的内容。:注意:这里需要加斜杆/Films ;//从app.vue组件中进入Films组件的时候,跳转的地址是:http://localhost:5173/Films,这时候就找到了顶级路由/Films,到然进入子级路由children,发现了后/Films需要跳转到/Films/NowPlayingpath: '/Films',redirect: "/Films/NowPlaying"},]},{path: "/Cinemas", //路径:影院name: "Cinemas", //路由名称,如果不指定name 默认的name为default//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。component: () => import("../views/Cinemas.vue")},{path: "/Home", //路径:我的name: "Home", //路由名称,如果不指定name 默认的name为default//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。component: () => import("../views/Home.vue"),meta: //加一个自定义参数:里面的参数随便我们定{requireAuth: true, // 对当前路由路径做一个标记,代表进入这个页面需要登陆才能进。用于在router.beforeEach里面做登陆验证的时候,判断这个requireAuth参数是否为true,为true则需要登陆才能进入aaa: "wowow"}},{path: "/Login", //登陆name: "Login", //路由名称,如果不指定name 默认的name为defaultcomponent: () => import("../views/Login.vue"),},{path: "/:pathMatch(.*)", //404错误name: "NotFound", //路由名称,如果不指定name 默认的name为defaultcomponent: () => import("../views/NotFound.vue")}]//创建路由对象
const router = createRouter({history: createWebHistory(), //这种方式基于浏览器 history API 的路由模式,url的样式是:http://localhost:5173/listroutes: routes,
})//路由全局拦截:在进入页面之前就进行拦截。可以用于做用户登陆验证
//参数to: 表示即将进入的目标路由对象
//参数from:表示当前导航正要离开的路由
//参数next:调用该方法后才能进入下一个钩子。next() 直接进入下一个钩子,next(false) 中断当前的导航。next('/') 或者 next({ path: '/' }) 则会进入一个不同的地址。
router.beforeEach(async (to, from, next) => {const isAuthenticated = await localStorage.getItem('token');console.log(to.fullPath); //全路径console.log(to.path); //路径console.log(to.name); //路由名称console.log(to.params); //路由参数:http://localhost:5173/FilmsDetail/123console.log(to.query); //路由参数:http://localhost:5173/FilmsDetail?myid=123console.log(to.meta); //路由自定义参数//meta.requireAuth表示当前请求的页面需要验证, 并且未登录if (to.meta.requireAuth && !isAuthenticated) {next(`/login?redirect=${to.path}`) //to.fullPath}else next() //如果不是请求的登陆界面,或者已经登陆过了,则直接跳转到用户请求的界面
})//路由全局拦截:在进入页面之后才进行触发拦截。
router.afterEach(async (to, form) => {//用的比较少,一般用于收集一些日志信息,做用户行为分析:例如:收集页面浏览量:PV
})export default router //导出router路由对象//导出router路由对象
main.js
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'import router from "../src/router/index.js" //导入路由js var app=createApp(App)app.use(router) //注册路由组件app.mount("#app")
单独页面路由拦截
针对某个组件使用路由拦截,
例如:我需要对 Home组件单独验证用户是否登陆
VOA写法:
Home.vue组件
<template><div>我的</div>
</template><script>
export default {//进入页面(组件)之前就拦截async beforeRouteEnter(to, from, next) {const isAuthenticated = await localStorage.getItem('token');console.log(to.fullPath); //全路径console.log(to.path); //路径console.log(to.name); //路由名称console.log(to.params); //路由参数:http://localhost:5173/FilmsDetail/123console.log(to.query); //路由参数:http://localhost:5173/FilmsDetail?myid=123console.log(to.meta); //路由自定义参数//判断是否登陆if (!isAuthenticated) {next(`/login?redirect=${to.path}`) //to.fullPath//next({name:"Login"})}else next() //如果不是请求的登陆界面,或者已经登陆过了,则直接跳转到用户请求的界面},//页面更新的时候进入:一般情况下从一个组件切换到另外一个组件,只会存在加载和卸载,那组件什么时候更新呢?//组件更新场景举列:我Films电影页面有一个电影列表,比如有如下电影:流浪地球,红海行动,湄公河,战狼,当我点击流浪地球,就会进入流浪地球的详情页面。http://localhost:5173/FilmsDetail/6616/流浪地球(注意:/6616/流浪地球 是参数,6616是电影ID,流浪地球是电影名称)//而在“流浪地球”的详情页面中的底部有一个电影推荐,或者叫“猜你喜欢”的模块,里面向我们推荐了“红海行动” //当用户在“流浪地球”的详情页面中 点击“红海行动” 页面机会跳转到 “红海行动”的详情页面中 ,“红海行动”这部电影的url地址是:http://localhost:5173/FilmsDetail/6617/红海行动 (注意:/6617/红海行动 是参数,6617是电影ID,红海行动是电影名称)//也就是说“流浪地球”与“红海行动”两部电影的URL地址是一样的,只是参数不同,这就是页面更新。async beforeRouteUpdate(to, from) {console.log(to.params)console.log(to.params.myid)},//从当前组件切换到其他组件的时候触发:例如从电影-跳转到-影院的时候触发beforeRouteLeave(to ,from){const answer=window.confirm("你数据还没有保存,确定要离开吗?")if(!answer) return false;}}
</script>
VCA写法
在单组件中vue-router中没有提供onBeforeRouteEnter的函数,无法在<script setup>中使用。但是如果要用,我们也有办法。
<template><div></div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { useRoute, useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router'const route = useRoute();
const router = useRouter();//页面更新的时候进入:一般情况下从一个组件切换到另外一个组件,只会存在加载和卸载,那组件什么时候更新呢?
//组件更新场景举列:我Films电影页面有一个电影列表,比如有如下电影:流浪地球,红海行动,湄公河,战狼,当我点击流浪地球,就会进入流浪地球的详情页面。http://localhost:5173/FilmsDetail/6616/流浪地球(注意:/6616/流浪地球 是参数,6616是电影ID,流浪地球是电影名称)
//而在“流浪地球”的详情页面中的底部有一个电影推荐,或者叫“猜你喜欢”的模块,里面向我们推荐了“红海行动”
//当用户在“流浪地球”的详情页面中 点击“红海行动” 页面机会跳转到 “红海行动”的详情页面中 ,“红海行动”这部电影的url地址是:http://localhost:5173/FilmsDetail/6617/红海行动 (注意:/6617/红海行动 是参数,6617是电影ID,红海行动是电影名称)
//也就是说“流浪地球”与“红海行动”两部电影的URL地址是一样的,只是参数不同,这就是页面更新。
onBeforeRouteUpdate((to, from) => {console.log(to.params)console.log(to.params.myid)
})//从当前组件切换到其他组件的时候触发:例如从电影-跳转到-影院的时候触发
onBeforeRouteLeave((to, from) => {const answer = window.confirm("你数据还没有保存,确定要离开吗?")if (!answer) return false;
})
</script><!-- 注意:vue-router中没有提供onBeforeRouteEnter的函数,无法在<script setup>中使用,无法在VCA中使用,如果实在要用就用如下方式来使用 -->
<script>
export default {async beforeRouteEnter(to, from, next) {const isAuthenticated = await localStorage.getItem('token');// console.log(to.fullPath); //全路径// console.log(to.path); //路径// console.log(to.name); //路由名称// console.log(to.params); //路由参数:http://localhost:5173/FilmsDetail/123// console.log(to.query); //路由参数:http://localhost:5173/FilmsDetail?myid=123// console.log(to.meta); //路由自定义参数//判断是否登陆if (!isAuthenticated) {next(`/login?redirect=${to.path}`) //to.fullPath//next({name:"Login"})}else next() //如果不是请求的登陆界面,或者已经登陆过了,则直接跳转到用户请求的界面}
}
</script>
相关文章:
Vue3.0路由拦截
全局路由器拦截:官方叫导航守卫 index.js路由器 import { createRouter, createWebHistory } from "vue-router"; //导入vue-router路由模块,createWebHashHistor函数const routes [{path: "/", //路径: redirect: "/Films" //涉…...
EtherCAT转EtherNET/IP协议网关控制EtherCAT伺服驱动器的方法
只需一步,将你的EtherCAT协议设备转换为EthernetIP协议! 捷米特JM-ECTM-EIP网关,这款专为EtherCAT协议设备设计的转接装置,可以轻松地将EtherCAT设备数据采集的数据转换成EthernetIP协议。而且,我们的网关接口非常灵活…...
钉钉内嵌H5遇到的一些问题
基于钉钉内核开发的政务云APP,在里面开发H5应用时会遇到一些莫名其妙的BUG 标题1、React打包H5时,安卓手机白屏的问题。 1、钉钉安卓使用 UC3.0 内核,版本比较低 2、React Vite TS 打包的H5应用的安卓端无法正常使用 3、添加 build 配置项…...
LeetCode 热题100——链表专题(二)
一、环形链表 141.环形链表(题目链接) 思路:使用快慢指针,慢指针走一步,快指针走俩步,如果是环形链表,那么快慢指针一定相遇,如果不是环形结构那么快指针或者快指针的next一定先为N…...
【Rust日报】2023-11-06 ESP上使用 Rust实现 SNTP协议
ESP上使用 Rust实现 SNTP协议 在这篇文章中,作者使用 ESP 和 Rust 使用 SNTP 协议将设备系统时间与网络时间同步。 SNTP 是 Simple Network Time Protocol 的缩写,它是一种用于在计算机系统之间通过分组交换、可变延迟数据网络进行时钟同步的网络协议。S…...
LibreOJ - 2874 历史研究 (回滚莫队)
回滚莫队就是在基础莫队的前提下,用更多的增加操作代替了减操作。 分成两种情况 1、一个询问的整个区间都在一个块儿里;这种情况直接暴力求即可,因为在一个块儿里,时间复杂度不会高。 2、一个询问的整个区间不在一个块儿里&#…...
人工智能-卷积神经网络之多输入多输出通道
多输入多输出通道 每个图像的多个通道和多层卷积层。例如彩色图像具有标准的RGB通道来代表红、绿和蓝。 但是到目前为止,我们仅展示了单个输入和单个输出通道的简化例子。 这使得我们可以将输入、卷积核和输出看作二维张量。 当我们添加通道时,我们的输…...
Open3D(C++) Umeyama算法求两个点云的变换矩阵
目录 一、算法原理1、原理概述2、主要函数3、算法源码4、参考文献二、代码实现1、详细过程2、调用函数三、结果展示四、相关链接一、算法原理 1、原理概述 原版英文论文有很详细的公式推导过程,考虑到论文年代久远,存在下载困难问题。因此,这里给出论文中的推导过程截图。...
【C++】从入门到精通第二弹——类的构造与析构函数
这里写目录标题 类的构造函数类的析构函数 写在最前面的话 ——构造函数和析构函数是两个特殊的成员函数,都没有返回值,构造函数名和类名相同,析构函数名只是在类名前加上 ~ 构造函数主要用来在创建对象时给对象中的数据成员赋值,…...
C#8.0本质论第十一章--异常处理
C#8.0本质论第十一章–异常处理 11.1多异常类型 用关键字throw抛出异常实例,所选的异常类型应该能最好地说明发生异常的背景。 11.2捕捉异常 发生异常时,会跳转到与异常类型最匹配的catch块执行,匹配度由继承链决定。 从C#6.0起…...
FPGA高端项目:图像缩放+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持
目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案我这里已有的图像处理方案 3、设计思路框架设计框图视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择…...
ansible安装和常见模块
文章目录 ansible的安装1.1 yum install epel-release.noarch1.2配置epel源的baseurl1.3安装ansible1.4安装ansible报错问题1.5 yum卸载 ansible的安装 ansible是由epel源提供的,所以需要配置epel源。要么通过配置好的baseos源直接执行“yum install epel-release.…...
【Python基础】 Python设计模式之单例模式介绍
单例模式 1.设计模式2.单例设计模式的应用场景3.new方法4. Python 中的单例 1.设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案使用 设计模式 是为了可重用代码、让代码更容易被他人理…...
算法小白的心得笔记:关于Nan
NaN 是什么 在C中,NaN(Not a Number)是一种特殊的浮点数值,用于表示无法表示的数值或未定义的操作,例如0除以0。如果你的double类型变量显示为NaN,那么可能是在计算过程中出现了这种未定义的操作。 如果你…...
Photoshop 2023 v24.7
Photoshop是一款强大的图像编辑软件,被广泛应用于图像处理、图形设计、数字绘画等领域。它提供了丰富的图像编辑功能,可以用于调整图像的色彩、亮度、对比度等,添加特效、滤镜,以及进行复杂的图像合成和修复。 以下是Adobe Photo…...
进程间通信(IPC)-管道、消息队列、信号量、共享存储、socket
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。 IPC的方式通常有管道(包括无名管道PIPE和命名管道FIFO)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持…...
「Verilog学习笔记」使用generate…for语句简化代码
专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 generate…for语句是Verilog HDL语言特有的语句,使用循环结构编写可综合的多个形式相近的代码,循环变量必须由特定关键字genvar声明。 timesca…...
互联网Java工程师面试题·Spring篇·第七弹
目录 36、什么是基于 Java 的 Spring 注解配置? 给一些注解的例子. 37、什么是基于注解的容器配置? 38、怎样开启注解装配? 39、Required 注解 40、Autowired 注解 41、Qualifier 注解 42、在 Spring 框架中如何更有效地使用 JDBC? 43、JdbcTemplate 44…...
mysql驱动包引起的告警问题using SSL the verifyServerCertificate property is set to ‘false‘
tomcat启动时报以下ssl的连接错误,mysql版本为5.7.17,虽然系统可以使用,但是日志量太大,还是处理下,只需要修改mysql的连接格式: url.db “jdbc:mysql://localhost:3306/disis3?userroot&passwordXXXX…...
draw.io与项目管理——如何利用流程图工具提高项目管理效率
draw.io 是一款强大的图形绘制工具,用于创建各种类型的图表、流程图、组织结构图、网络图和平面设计等。它提供了丰富的绘图工具和预定义的图形库,使用户能够轻松创建专业水平的图形作品。 draw.io具有直观的界面和简单易用的功能,适合各种用…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)
经过前面几期的内容我们学习了很多网络安全的知识,而这期内容就涉及到了前面的第六期-RCE模块,第七期-File inclusion模块,第八期-Unsafe Filedownload模块。 什么是"遍历"呢:对学过一些开发语言的朋友来说应该知道&…...
GitHub 常见高频问题与解决方案(实用手册)
1.Push 提示权限错误(Permission denied) 问题: Bash Permission denied (publickey) fatal: Could not read from remote repository. 原因: 没有配置 SSH key 或使用了 HTTPS 而没有权限…...
