【Vue路由守卫】

article/2025/9/18 1:44:59

Vue路由守卫

  • Vue路由守卫
    • 全局路由守卫
      • 全局前置守卫
      • 全局后置守卫
      • 实例代码:
    • 独享守卫
    • 组件内守卫
    • 总结


Vue路由守卫

路由守卫,简单理解来说就是,当用户要进行一些操作时,我需要用户的一些信息或数据或行为,我判断过后,才会同意用户进行操作,说到这里,我想大家心里都或多或少有点理解了吧,官方一点的解释就是进行操作的鉴权,当操作与之条件匹配时,操作成功,当操作与之不匹配时,操作终止,作用就是是对路由进行权限控制。

在Vue中,路由守卫分为三种:全局路由守卫、独享路由守卫以及组件内路由守卫

全局路由守卫

全局路由守卫,顾名思义,一旦配置,那么作用范围就是所有的路由,全局路由又分为全局前置守卫全局后置守卫

全局前置守卫

全局前置守卫,组件初始化时调用,每次路由切换之前调用,路由切换之前指的就是,举个例子说,当前我在A路由组件,我要切换到B路由组件,那么前置路由守卫就是在我点了切换按钮,但B路由组件还没有被呈现在页面上的时候被调用。

//全局前置守卫
router.beforeEach((to,from,next) =>{//第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象//第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象//第三个参数next(),是否往下执行,执行的话,如果不写的话路由就不会跳转,操作将会终止
})

全局后置守卫

全局后置守卫,组件初始化时调用,每次路由切换之后调用,路由切换之后指的就是,举个例子说,当前我在A路由组件,我要切换到B路由组件,那么前置路由守卫就是在我点了切换按钮B路由组件呈现到页面中后被调用。

router.afterEach((to,from) =>{//第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象//第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象

实例代码:

下面我写的实例是当时看网课尚硅谷老师教的,结合浏览器的Local Storage做出鉴权操作:
主要的就是src/store/index.js文件中的配置
src/store/index.js:

//该文件用于创建整个应用的router
//首先,需要引用vue-router
import VueRouter from "vue-router";//引入路由组件
import TestA from '../pages/TestA'
import TestB from '../pages/TestB'
// 引入二级路由组件
import TestBHzw from '../pages/TestBHzw'
import TestBHyrz from '../pages/TestBHyrz'import DataList from '../pages/DataList'//创建并暴露一个VueRouter
const router =  new VueRouter({routes:[//配置路由路径和路由组件{//这里的路径可自由定义,但是为了初学者好理解,我就采用和组件同样的命名,防止在写路径的时候搞混name:'导航一',path:'/TestA',component:TestA,     //要跳转到的组件   children:[{// 给二级路由起名字name:'DataName',path:'DataList/:introduce',     //起到占位作用component:DataList}]},{name:'导航二',path:'/TestB',component:TestB,meta:{isAuth:true,},// 配置二级路由children:[{path:'TestBHzw',     //重点注意,不要加 /component:TestBHzw},{path:'TestBHyrz',component:TestBHyrz}]}]
})//全局前置路由,配合浏览器localStorage进行鉴权操作
router.beforeEach((to, from, next) =>{//首先,我们先看一看to和from参数,next就是执行的意思,不写页面是不会跳转的// console.log(to, from);if(to.meta.isAuth){     //判断是否需要鉴权if(localStorage.getItem('name') === '张三'){next();}else{alert('不好意思,姓名不对,没有权限');}}else{next()}
})// 全局后置路由,简单写一个弹窗,在进入每一个路由组件后弹出一句话
router.afterEach(() =>{alert('欢迎你!!');
})export default router;

TestA.vue:

<template><div><h4>著名动漫简介</h4><ul><li v-for="i in DataList" :key="i.id"><!-- 使用params参数传递动态参数 注意:params传递参数必须配合name属性--><router-link :to="{name:'DataName',params:{introduce:i.introduce}}">{{i.name}}</router-link></li></ul><router-view></router-view></div>
</template><script>
export default {name:'TestA',data(){return{DataList:[{id:1,name:'《海贼王》',introduce:'《航海王》是日本漫画家尾田荣一郎作画的少年漫画作品,于1997年7月22日在集英社《周刊少年Jump》开始连载。改编的电视动画《航海王》于1999年10月20日起在富士电视台首播。'},{id:2,name:'《火影忍者》',introduce:'电视动画《火影忍者》改编自日本漫画家岸本齐史的同名漫画,2002年10月3日在东京电视台系列全6局、岐阜放送首播,共220话;第二季《火影忍者疾风传》于2007年2月15日-2017年3月23日在东京电视台播出,共500话;累计全720话。'},{id:3,name:'《斗破苍穹》',introduce:'《斗破苍穹》是一部由阅文集团旗下起点中文网作家天蚕土豆同名玄幻长篇经典小说改编的动画。该动画第一季已于2017年1月7日在腾讯视频上映,bilibili同步跟播,共十二集。'},{id:4,name:'《鬼灭之刃》',introduce:'《鬼灭之刃》是日本漫画家吾峠呼世晴所著的少年漫画,自2016年2月15日—2020年5月11日在集英社《周刊少年Jump》上连载。已完结。'}]}}
}
</script><style scoped>
h4{text-align: center;
}
a{text-decoration: none;
}
.active:visited{color: brown;
}
</style>

TestB.vue:

<template><div><h4>我是内容二</h4><!-- 多级路由 --><div class="box"><!-- 此处路径一定要写完整路径 --><router-link to="/TestB/TestBHzw" active-class="active">点击查看《海贼王的简介》</router-link>&nbsp;&nbsp;&nbsp;<router-link to="/TestB/TestBHyrz" active-class="active">点击查看《火影忍者的简介》</router-link><hr><router-view></router-view></div></div>
</template><script>
export default {name:'TestB',
}
</script><style scoped>
h4{text-align: center;
}
.box{text-align: center;
}
a{text-decoration: none;
}
.active:visited{color: brown;
}
</style>

DataList.vue:

  <template><div><ul><!-- 采用插值语法就可以拿到父级路由中的数据 --><li>{{$route.params.introduce}}</li></ul></div>
</template><script>
export default {name:'DataList'
}
</script><style></style>

TestBHzw.vue和TestBHyrz.vue的结构是一样的,就不重复展示了:

<template><div><p>电视动画《火影忍者》改编自日本漫画家岸本齐史的同名漫画,2002年10月3日在东京电视台系列全6局、岐阜放送首播,共220话;第二季《火影忍者疾风传》于2007年2月15日-2017年3月23日在东京电视台播出,共500话;累计全720话。</p></div>
</template><script>
export default {name:'TestBHyrz'
}
</script><style></style>

当然,想要配置路由守卫,前提就是把基本的路由配置好

因为不管是前置守卫和后置守卫,都有三个参数,netx()我们已经说过,不写的话不会往下一步走,
那么我们输出一下
to
from看看
当前页面是初始化页面,所以此时输出的to, from都是空对象。
在这里插入图片描述
当我们点击 “导航一” 时,to里面有了新内容,为什么from没有呢,是因为我们处于最顶层初始化页面,在我们点击之前,我们是没有路由的,所以只能捕获到我们要去往哪一个路由组件,匹配不到我们来自哪一个路由组件
在这里插入图片描述
当我们处于第一级路由的 “导航一” 跳往 “导航二” 时,此时的to和from就显而易见了
在这里插入图片描述
要想配合localStorage来实现鉴权,我们就要先在浏览器中给他一对key—value
在这里插入图片描述
现在我们就可以把鉴权的操作写在前置守卫中了
在这里插入图片描述
后置守卫就简单实现一下进入组件后实现弹窗
在这里插入图片描述

此时我们切换到“导航二”组件时,前置路由守卫已经拒绝了我们的访问,那是因为我在鉴权操作中,匹配的名字是“张三”
在这里插入图片描述
把名字改为“王五”后,我们可以正常访问“导航二”组件了
在这里插入图片描述


独享守卫

组件独享守卫是在进入组件时被调用,区别就在于,想对那个路由进行权限控制就直接在其路由配置项中添加守卫,作用域也仅限于该路由

beforeEnter(to,from,next){//第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象//第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象//第三个参数next(),是否往下执行,执行的话,如果不写的话路由就不会跳转,操作将会终止
}

可自行去尝试,其实效果都是一样的,只不过,全局路由守卫服务的是所有路由组件,而独享路由守卫只服务于被配置的单个路由组件


组件内守卫

当使用路由规则进入该组件或离开该组件时,就会触发组件内守卫的调用,而组件内守卫的作用于范围也仅限于该组件

//进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next) {//第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象//第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象//第三个参数next(),是否往下执行,执行的话,如果不写的话路由就不会跳转,操作将会终止
},
//离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next) {//第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象//第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象//第三个参数next(),是否往下执行,执行的话,如果不写的话路由就不会跳转,操作将会终止
}

唯一不同于之前的就是
BeforeRouterLeave(),它并不像全局后置守卫一样在路由组件加载完成之后调用,而是在你切换出这个组件后被调用,也就是离开这个组件后被调用,在开发中,我们也可以使用BeforeRouterLeave() 来完成某些操作,比如当我要切换出该组件事,我希望该组件的操作能暂停,而不是一直运行,只有当我切换回该组件时,又再次运行,这样的操作就可以配合着beforeRouteEnter() 来完成,也可以提高应用的性能


总结

路由守卫在实际开发过程中是一个较为重要的知识点,其作用和功能在实际开发中也大大方便了我们的开发,在对用户鉴权操作时也提高了我们编写代码的小效率,以上就是我个人在学习时对路由守卫的理解和笔记。
在这里插入图片描述
纸上得来终觉浅,绝知此事要躬行!!

创作不易,记得点赞收藏加关注哟


http://chatgpt.dhexx.cn/article/Y7bdmOCr.shtml

相关文章

vue 动态路由实现 后端控制权限时的前端处理

前端思路&#xff1a; 上图中 获取路由信息 &#xff0c;可以是后端控制的&#xff0c;可以是前端根据用户信息从路由表中筛选的。 此处只讲解后端存储路由信息的情况 组织路由信息 请求后台&#xff0c;获取返回结果&#xff0c;结果有两种可能&#xff0c;一种是组合好的…

vue-router路由权限控制的两种实现方案

前言 最近在抽时间写一套后台管理系统框架模板&#xff08;vueelement-ui&#xff09;&#xff0c;记录一些问题的解决方案。文章没什么顺序&#xff0c;就想到什么写什么了&#xff0c;也都是之前工作上碰到的问题。 抛出问题 Vue项目路由权限控制怎么实现&#xff1f; 实现…

Vue路由

目录 一、路由的概念 二、事前准备 三、 路由的相关知识点 3.1 路由的基本认识 3.2 路由小案例 3.3 路由模式的切换 3.4 指定路由的渲染位置 3.5 声明式导航 3.5.1 无参模式 3.5.2 传参模式 3.5.3 $route 与$router的区别 3.6 编程式导航 3.6.1 第一种get方…

Vue动态路由使用(后端控制)

使用VUE开发后台管理系统 完全由后端控制左边菜单项思路 在传统开发后台管理系统时&#xff0c;都会涉及权限控制这一功能需求 即&#xff1a;根据不同登录的角色账号来使用该账号拥有的功能&#xff0c;也就是说系统左边的菜单栏不是固定不变的&#xff0c;而是根据登录账号的…

Vue学习:路由

2. 路由 2.1 前端路由的发展历程 2.1.1 认识前端路由 路由其实是网络工程中的一个术语&#xff1a; 在架构一个网络时&#xff0c;非常重要的两个设备就是路由器和交换机。 ​ 当然&#xff0c;目前在我们生活中路由器也是越来越被大家所熟知&#xff0c;因为我们生活中都…

vue权限控制和动态路由

思路 登录&#xff1a;当用户填写完账号和密码后向服务端验证是否正确&#xff0c;验证通过之后&#xff0c;服务端会返回一个token&#xff0c;拿到token之后&#xff08;我会将这个token存贮到localStore中&#xff0c;保证刷新页面后能记住用户登录状态&#xff09;&#xf…

Vue 路由权限控制

当我们在做后台管理系统的时候&#xff0c;都会涉及到系统左侧的菜单树如何动态显示的问题。目前基本上都是RBAC的解决方案&#xff0c;即Role-Based Access Control&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了…

【Git CMD】Git常用命令总结

目录 0 git的工作区、暂存区、本地仓库和远程仓库0.1 图解0.2 解析 1 本地仓库1.1 创建版本库1.2 分支1.2.1 查看本地仓库的分支信息1.2.2 创建分支1.2.3 切换分支1.2.4 重命名分支1.2.5 合并分支1.2.6 删除分支 1.3 添加文件到暂存区1.3.1 添加单个文件1.3.2 添加多个文件1.3.…

Git常用命令大全(从入门到使用,学不会评论区骂我)

Git常用命令大全 1&#xff1a;Git全局设置 当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的&#xff0c;因为每次Git提交都会使用该用户信息。在Git 命令行中执行下面命令&#xff1a; 设置用户信息 git config --global user.name “你的用户名” …

Git常用命令及方法大全

下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace&#xff1a;工作区Index / Stage&#xff1a;暂存区Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09;Remote&#xff1a;远程仓库 本地分支关联远程&#xff1a;git branch --set-upstre…

Git 常用命令大全

一、 Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释 git remote add origin git192.168.1.119:ndshowgit push origin …

Git常用命令大全

Git常用命令大全 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace&#xff1a;工作区Index / Stage&#xff1a;暂存区Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09;Remote&#xff1a;远程仓库 本地分支关联远程 git branch --set-u…

git常用命令总结

1 git概述 1.1 简介 git是分布式版本控制系统&#xff08;Distributed Version Control System&#xff0c;简称DVCS&#xff09;&#xff0c;分为两种仓库 &#xff1a;本地仓库和远程仓库。 本地仓库&#xff1a;是在开发人员自己电脑上的Git仓库远程仓库&#xff1a;是在…

20 个最常用的 Git 命令用法说明及示例

在这篇文章中&#xff0c;我将介绍在使用 Git 时最常使用的 20 个命令。 作者 | Sahiti Kappagantula 译者 | 弯月&#xff0c;责编 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 以下为译文&#xff1a; 以下是这些Git命令&#xff1a; git config git…

Git基本命令大全

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 1、git clone -b <指定分支名> <远程仓库地址> 克隆指定分支 如&#xff1a; git clone -b bestore_master ssh://gitgit-ssh.xxx.com/xxx.git 2、 git bra…

常用git命令总结大全

目录 一、常用命令 1、git init 2、git add 文件名 3、git commit -m “备注” 4、git status 与 git diff 5、git show commit_id 查看某次修改 6、git log 与 git reflow 7、git pull (--rebase) 8、git push (-u) 与 git branch (-u) 9、git reset --hard 与 git…

Git常用命令

这是一篇笔记 //查看某个命令文档 git help <command> git <command> -h git <command> --help1.基本操作 用户配置 git config --global user.name "bettyaner" git config --global user.email bettyaner163.com配置级别 –local&#xff08…

Git 常用命令速查表(收藏大全)

目录 一、新建代码库 二、配置 三、增加/删除/修改文件 四、代码提交 五、分支 六、标签 七、查看信息 八、远程操作 九、撤销 十、其他 名词 master: 默认开发分支 origin: 默认远程版本库 Index / Stage&#xff1a;暂存区 Workspace&#xff1a;工作区 Reposito…

【深度学习】ResNet50

结构 ResNet50结构&#xff1a; 推荐查看&#xff1a;caffe可视化版 resnet50中1x1filter的作用&#xff1a; 1、在shortcut connection block的残差层中使用1x1的fiter先降维&#xff08;channel&#xff09;&#xff0c;然后再使用1x1的fiter升维,使残差层输出与恒等映射…

ResNet-50 结构

ResNet有2个基本的block&#xff0c;一个是Identity Block&#xff0c;输入和输出的dimension是一样的&#xff0c;所以可以串联多个&#xff1b;另外一个基本block是Conv Block&#xff0c;输入和输出的dimension是不一样的&#xff0c;所以不能连续串联&#xff0c;它的作用本…