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

vue三种路由守卫详解

在 Vue 中,可以通过路由守卫来实现路由鉴权。Vue 提供了三种路由守卫:全局前置守卫、全局解析守卫和组件内的守卫
在这里插入图片描述

  1. 全局前置守卫
    通过 router.beforeEach() 方法实现,可以在路由跳转之前进行权限判断。在这个守卫中,可以根据用户的登录状态、角色等信息来判断用户是否有权限访问该路由。如果没有权限,则可以跳转到登录页面或者其他提示页面。
  2. 全局解析守卫
    通过 router.beforeResolve() 方法实现,可以在路由解析之前进行权限判断。这个守卫可以用于处理异步路由加载的情况,确保在加载路由之前进行权限判断。
  3. 组件内的守卫
    通过 beforeRouteEnter 、 beforeRouteUpdate 和 beforeRouteLeave 这三个钩子函数实现。这些守卫直接在组件内部定义,并且会在组件的路由导航过程中触发。可以用于执行一些与组件相关的逻辑,例如加载组件的数据、检查组件的状态等。

全局前置守卫代码示例

以下是一个示例代码,展示了如何使用全局前置守卫来限制未登录用户的访问:

const router = new VueRouter({
routes: [
{
path: ‘/’,
component: HomeComponent,
},
{
path: ‘/login’,
component: LoginComponent,
},
],
});

router.beforeEach((to, from, next) => {
// 检查用户是否已登录
if (!isLoggedIn) {
next(’/login’);
} else {
next();
}
});

在这个示例中,定义了一个全局前置守卫,使用 router.beforeEach() 方法来检查用户是否已登录。如果用户未登录,则导航到登录页面,否则允许继续导航。

全局解析守卫的示例代码

这个示例展示了如何使用 router.beforeResolve() 方法进行权限判断:

router.beforeResolve((to, from, next) => {
// 获取要进入的路由组件
const component = to.matched[0].components.default;

// 进行权限检查
if (hasPermission(component)) {
next();
} else {
// 没有权限,跳转到错误页面或执行其他操作
next(’/error’);
}
});

在这个示例中,使用 router.beforeResolve() 方法定义了全局解析守卫。通过获取要进入的路由组件,并进行权限检查来确定用户是否有权访问该组件。如果有相应权限,就继续导航;否则,跳转到错误页面或执行其他操作。

请注意,全局解析守卫在路由解析完成后触发,也就是在组件被加载之前。这意味着你可以在守卫中进行更复杂的权限检查,例如检查组件的特定属性或与服务器进行异步验证。

三种组件内守卫代码示例

在 Vue.js 中,组件内守卫有三个: beforeRouteEnter 、 beforeRouteUpdate 和 beforeRouteLeave 。以下是一个示例代码,展示了如何使用这三种组件内守卫:

export default {
name: ‘About’,
// beforeRouteEnter 是进入守卫,通过路由规则,进入该组件时被调用
beforeRouteEnter(to, from, next) {
console.log(‘About–beforeRouteEnter’, to, from)
if (to.meta.isAuth) {
if (localStorage.getItem(‘school’) === ‘atguigu’) {
next()
} else {
alert(‘学校名不对,无权限查看!’)
}
} else {
next()
}
},
// beforeRouteLeave 是离开守卫,通过路由规则,离开该组件时被调用
beforeRouteLeave(to, from, next) {
console.log(‘About–beforeRouteLeave’, to, from)
next()
},
// beforeRouteUpdate 是更新守卫,组件被复用(例如从缓存中恢复)时被调用
beforeRouteUpdate(to, from, next) {
console.log(‘About–beforeRouteUpdate’, to, from)
next()
}
}

在上述示例中, beforeRouteEnter 守卫会在进入 About 组件时被调用。如果路由规则中设置了 isAuth 元数据并且本地存储中 school 的值为 atguigu ,则允许进入该组件;否则会弹出一个警告框。 beforeRouteLeave 守卫会在离开 About 组件时被调用,它只是简单地继续执行下一个路由。 beforeRouteUpdate 守卫会在组件被复用(例如从缓存中恢复)时被调用,它也只是简单地继续执行下一个路由。

请注意,上述示例代码中的 isAuth 元数据和 localStorage.getItem(‘school’) 是自定义的,你可以根据实际需求进行相应的修改。

相关文章:

  • JDK、JRE、JVM三者关系详解
  • 当go get获取不到软件包时
  • 第六篇:MySQL图形化管理工具
  • 关于在分布式环境中RVN和使用场景的介绍3
  • Kafka集群安装与部署
  • 力扣-1. 两数之和
  • 华为问界M9:领跑未来智能交通的自动驾驶黑科技
  • ACK One Argo工作流:实现动态 Fan-out/Fan-in 任务编排
  • TinUI v5预发布记录
  • Javaweb之SpringBootWeb案例之propagation属性案例演示的详细解析
  • 使用C++从零开始,自己写一个MiniWeb
  • 贪心算法之找零钱
  • openJudge | 距离排序 C语言
  • OCP使用web console创建和构建应用
  • 设计模式理解:单例模式+工厂模式+建设者模式+原型模式
  • 【EOS】Cleos基础
  • 2017届校招提前批面试回顾
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CSS中外联样式表代表的含义
  • export和import的用法总结
  • gitlab-ci配置详解(一)
  • Octave 入门
  • XForms - 更强大的Form
  • 今年的LC3大会没了?
  • 两列自适应布局方案整理
  • 排序算法学习笔记
  • 前端之React实战:创建跨平台的项目架构
  • ​ArcGIS Pro 如何批量删除字段
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (力扣)1314.矩阵区域和
  • (六)Hibernate的二级缓存
  • (篇九)MySQL常用内置函数
  • (区间dp) (经典例题) 石子合并
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三十五)大数据实战——Superset可视化平台搭建
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)iOS字体
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)ObjectiveC 深浅拷贝学习
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 6 集成和使用 mongodb
  • .NET Core跨平台微服务学习资源
  • .net mvc部分视图
  • .net 程序发生了一个不可捕获的异常
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • @ModelAttribute 注解