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’) 是自定义的,你可以根据实际需求进行相应的修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/467940.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Decian 12.x基于LNMP安装phpIPAM(IP管理系统)

phpipam是一个开源Web IP地址管理应用程序(IPAM)。其目标是提供轻便,且有用的IP地址管理系统。它是基于PHP的应用程序,具有MySQL数据库后端,使用jQuery库,ajax和HTML5 / CSS3功能。 在Debian 12中&…

学生用的台灯哪种好?推荐央视公认好用的学生护眼台灯

随着太阳的落下,家家户户点亮了灯,孩子的案桌前也备上了台灯,让孩子在明亮的光线下更好学习写作业。但是家长们知道吗?其实孩子学习的台灯也是很有讲究的,不仅仅单看亮度是否充足,如果光线不适合是非常容易…

SpringCloud-Feign:负载均衡(基于服务端)

7.Feign:负载均衡(基于服务端) 7.1 Feign简介 Feign是一个开源的声明式HTTP客户端,它可以简化HTTP API的调用过程。Feign的设计目标是使得使用者可以像调用本地方法一样调用远程服务,使得编写和维护HTTP客户端变得更加简单。类似controller…

MongoDB 与 mongo-express docker 安装

MongoDB 和 mongo-express 与 MySQL 不同,MongoDB 为 NoSQL 数据库,MongoDB 中没有 table ,schema 概念,取而代之的 collection,其中 collection 存储的为 BSON 格式,是一种类似于 JSON 的用于存储 k-v 键…

FPGA实现ISP用于无人车、无人机配送的方案调研

查到一个always 奥唯思公司做的用FPGA实现ISP的方案,采用易灵思钛金16nm的FPGA Ti60F225,通过MIPI CSI RX采集图像传感器的数据,在FPGA内部经过一系列复杂的ISP运算后,再通过MIPI CSI TX将图像数据发送给后端。 一套完整的ISP&a…

探索机器学习:定义、算法及应用领域

目录 前言1 机器学习的定义2 机器学习算法2.1 监督学习2.2 无监督学习2.3 强化学习 3 机器学习的应用3.1 智能搜索3.2 医疗诊断3.3 无人驾驶 结语 前言 机器学习,源自Arthur Samuel的定义,赋予计算机通过领域学习的能力,使其在不需要明确程序…

Javaweb之SpringBootWeb案例之propagation属性案例演示的详细解析

案例 接下来我们就通过一个案例来演示下事务传播行为propagation属性的使用。 需求:解散部门时需要记录操作日志 由于解散部门是一个非常重要而且非常危险的操作,所以在业务当中要求每一次执行解散部门的操作都需要留下痕迹,就是要记录操作…

2024beginCTF-Crypto 复现

fake_N 题目: from Crypto.Util.number import * from secret import flagdef fakeN_list():puzzle_list []for i in range(15):r getPrime(32)puzzle_list.append(r)p getPrime(32)q getPrime(32)com p*qpuzzle_list.append(com)return puzzle_listdef encr…

洛谷数组P1319压缩技术

做题思路: 这里表示输入的第一个数字N为N*N的方阵,后面的数字表示连续输入几个1或者0,定义result表示实际输出的数字0或1(result输出0或1,可以用绝对值abs我们初始化result为0,我们将它-1后再取绝对值就可以…

C++ //练习 6.23 参考本节介绍的几个print函数,根据理解编写你自己的版本。依次调用每个函数使其输入下面定义的i和j

C Primer(第5版) 练习 6.23 练习 6.23 参考本节介绍的几个print函数,根据理解编写你自己的版本。依次调用每个函数使其输入下面定义的i和j: int i 0, j[2] {0, 1};环境:Linux Ubuntu(云服务器&#xff…

RK3588平台开发系列讲解(视频篇)RKMedia 数据流向

文章目录 一、 获取RKMedia模块通道中的数据二、RKMedia的数据源和接收者三、模块通道绑定API调用 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢RKMedia是RK提供的一种多媒体处理方案,可实现音视频捕获、音视频输…

LeetCode二叉树的垂序遍历

题目描述 给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row 1, col - 1) 和 (row 1, col 1) 。树的根结点位于 (0, 0) 。 二叉树的 垂序遍历 从最左边的列开始直到…