vue 路由守卫

2023-11-07

vue-router 提供的导航守卫主要用来通过或取消的方式来守卫导航。有多种机会植入路由导航的过程:
主要分为全局导航,单个路由导航 组件导航

所谓路由导航我们可以这么理解,导航守卫就相当于保安的意思,你要进入这个房子,保安需要知道你是(to, from, next)打哪去,从哪来。我们就拿登录来就例子:保安守卫一个房子 有一个客人来拜访(路由跳转)保安要问清楚从哪来(from)到哪去(to) 问清楚以后他还要打电话给房子的主人问他是否允许进入(登录时获取token,如果有token 就是直接跳转详情页,如果没有token就跳转登录页)
我们先看vue 官网上面的解析

你可以使用 router.beforeEach 注册一个全局前置守卫:

const router = new VueRouter({ … })

router.beforeEach((to, from, next) => {
// …
})
当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。

每个守卫方法接收三个参数:

to: Route: 即将要进入的目标 路由对象

from: Route: 当前导航正要离开的路由

next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: ‘home’ 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。

next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved。
关于next()的理解

关于next这个方法的描述应该如何理解:

1 next()

你乘坐汽车要从A景区到B景区,路过关卡时,守门人拦下你,你量出了next(),守门人一看没问题,赶紧放行,于是你顺利到达了B景区。

2.next(false)

如果你量出了next(false),守门人立马关住大门,不让你走,哪都不让你去,你说想换个交通方式,走路或者坐飞机,都不行,老实待在A景区吧

3.next(’/’)

你原本打算从A景区到B景区,但是走到关卡的时候由于某些原因改变了主意,想要去C景区,你对守门员量出了next({path:’/C’}),守门员一看,哦,原来你不去B了,要去C啊,去吧去吧,然后你顺利到达了C景区

4.next(error)

你在出发之前,给你妈妈说,妈,要是有什么事我立马通知你,你记得查看消息啊(你注册了router.onError())走到中途,出现了意外,你发出next(error),然后你妈就收到了消息,赶紧打电话问你怎么了(执行router.onError()里的回调)

下面是一个全局导航(判断当前页面是否需要登录)

router.beforeEach ((to,from,next) => {
  //将所有需要登陆才显示的页面的路由都放进一个数组
  const nextRoute = ['index', 'library', 'design', 'administration', 'production'];
  //获取登陆状态
  let isLogin = Global.isLogin
 
  if(to.name === 'login') {  //如果是登录页,则跳过验证
    next()  //必不可少
    return  //以下的代码不执行
  }
  if(nextRoute.indexOf(to.name) >= 0) {  //判断该页面是否需要登陆
    if(!isLogin) {   //判断登陆状态
      next({ name : 'login'})   //如果未登录,则跳转到登录页
    } else {
      next()  //如果已经登陆,那就可以跳转
    }
  } else {  //其他的无需登陆的页面不做验证
      next()
  }

这样就实现了全局守卫

全局前置守卫

const router = new VueRouter({})
router.beforeEach(to,form,next) => {
// 当一个导航出发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫resolve 完之前一直处于等待中
})

全局后置守卫

我们也可以注册全局后置守卫和前置守卫不同的是,后置守卫中没有next()

router.afterEach((to, from) => {
alert("后置守卫")
})

路由独享守卫(单个路由导航)

我们可以在路由配置上直接定义beforeEnter守卫

const router = new VueRouter({
routes:[
 {
   path: '/foo',
   component: foo,
   beforeEnter: (to, from, next) => {
     let isLogin = Global.isLogin
     if(isLogin) {
       next()
     }else {
       next('./login')
     }
   }
 }]
})

组件内路由导航

// 跟methods: {}等同级别书写,组件路由守卫是写在每个单独的vue文件里面的路由守卫
beforeRouteEnter (to, from, next) {
// 注意,在路由进入之前,组件实例还未渲染,所以无法获取this实例,只能通过vm来访问组件实例
next(vm => {})
}
beforeRouteUpdate (to, from, next) {
// 同一页面,刷新不同数据时调用,
}
beforeRouteLeave (to, from, next) {
// 离开当前路由页面时调用
}

beforeRouteEnter: (to, from, next) => {
    next(vm => {
      alert("hello" + vm.name);
    });
  }

  beforeRouteLeave(to, from, next) {
    if (confirm("确定离开吗?") == true) {
      next();
    } else {
      next(false);
    }
  }

这个大概就是我要说的内容,现在还有几点我们需要注意

路由存在的问题

1第一种

iif (to.path === '/warranty-stepThree') {
    if (sessionStorage.getItem('oneStep') && sessionStorage.getItem('twoStep')) {
      next('/warranty-stepThree) // 直接死循环
    } else {
      next('/warranty')
    }

this 的问题

在组件路由导航中
路由前置守卫中
当前组件实例还没有渲染 不能够直接调用this 需要用next(vm => {}) 来替代

 next(vm => {
      alert("hello" + vm.name);
    });

参考文章
https://blog.csdn.net/zezeadede555/article/details/88380767
https://www.cnblogs.com/listen9436/p/10472483.html
https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%90%8E%E7%BD%AE%E9%92%A9%E5%AD%90

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue 路由守卫 的相关文章

随机推荐

  • 神武3进不去 服务器响应,windows7系统玩神武2卡机的解决方法

    神武2是一款备受玩家们喜欢的游戏之一 不过有部分windows7系统用户在玩神武2游戏的时候 发现遇到了卡机的情况 一卡一卡非常不流畅 影响了正常游戏 要如何解决呢 本教程就给大家带来windows7系统玩神武2卡机的解决方法 1 可能导致
  • ZCA白化的步骤

    ZCA白化的主要用于去相关性 尽量使白化后的数据接近原始输入数据 对于含有m个样本的数据集 x 1 x 2 x m 假设每个样本的维度为n 即x i R n 对其进行ZCA白化的具体步骤如下 1 计算数据集的协方差矩阵 计算公式如下 1 m
  • Java 程序如何正确地打印日志?

    在 Java 开发中 打印日志是一项非常重要的工作 正确的打印日志可以帮助我们快速定位问题 并提高代码的可维护性和可读性 本文将为大家介绍 Java 程序如何正确地打日志 希望对大家有所帮助 一 为什么需要打印日志 在开发过程中 我们经常需
  • 仓库运行状况如何得知?数据挖掘是关键!

    库存 订单 出入库记录 物流信息 货物状态等数据 是仓库管理的重要组成部分 仓库数据的重要性 做好仓库数据管理对企业的重要性不言而喻 通过有效地管理数据 企业可以更好地了解市场需求和库存情况 快速响应市场变化 提高库存周转率和客户满意度 此
  • 阿里云centos7.9安装docker,创建nginx容器,启动vue3项目

    1 安装必要的依赖包 sudo yum install y yum utils device mapper persistent data lvm2 2 添加Docker存储库 sudo yum config manager add rep
  • 实现快速排序(数据结构与算法 - 排序)

    通过补全快速排序私有函数QSort 来供函数QuickSort调用 以此来实现快速排序的功能 相关知识 快速排序的基本过程是 从待排序记录中任选一个记录 以它的排序码作为中心值 将其它记录划分为两个部分 第一部分包含所有排序码小于等于中心值
  • 【TensorFlow】tf.reset_default_graph()函数

    如下是官网对tf reset default graph 函数描述的翻译 tf reset default graph函数用于清除默认图形堆栈并重置全局默认图形 注意 默认图形是当前线程的一个属性 该tf reset default gra
  • postman的参数是图片和文件如何设置,及操作提示this file is not in your working directory

    1 图片或者文件 作为参数的设置 在参数这里 选择文件 选择需要作为参数的文件 2 提示this file is not in your working directory 提示这个文件不在你的工作路劲下 设置一下当前的工作路径即可
  • 用sql语句对数据库表中的数据进行增删改

    如何使用sql语句对mysql数据库中表的数据进行增删改 这里新创了一个school数据库 在下面创建一张名为student表 创建student表的sql语句代码如下 使用school数据库 use school 判断是否存在studen
  • 手把手教你用 NebulaGraph AI 全家桶跑图算法

    前段时间 NebulaGraph 3 5 0 发布 whitewum 吴老师建议我把前段时间 NebulaGraph 社区里开启的新项目 ng ai 公开给大家 所以 就有了这个系列文章 本文是该系列的开篇之作 ng ai 是什么 ng a
  • Java中Scanner类中next与nextLine的区别

    1 next的意思是接受文字 有效文字 next不接收空格回车以及Tab 当你输入空格回车Tab的时候接收就会终止 并不会存入到String 变量中去 特别的情况 当在输入的时候先输入了几个空格然后再输入String中内容得时候String
  • C++ 程序文档生成器介绍(doxygen)

    http ly4cn cnblogs com archive 2005 11 23 282637 html 程序文档 曾经是程序员的一个头痛问题 写一个程序文档 比较花时间 但不是很难 麻烦的是当程序修改后 程序文档也要跟着同步更新 否则文
  • Python 练习实例11:兔子的规律为数列1,1,2,3,5,8,13,21

    古典问题 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不死 问每个月的兔子总数为多少 程序分析 兔子的规律为数列1 1 2 3 5 8 13 21 程序代码 def f n if n
  • 傅里叶变换、短时傅里叶变换、小波变换

    顺序 傅里叶 gt 短时傅里叶变换 gt 小波变换的顺序 转载自形象易懂的傅里叶变换 短时傅里叶变换和小波变换本文作者按照傅里叶 短时傅里叶变换 小波变换的顺序 由浅到深的解释小波变换的缘由以及思路 https mp weixin qq c
  • VMware中安装Kali一步解决(7z格式)

    VMware中安装Kali一步解决 7z格式 首先搜索Kali 进入官网找到VMware版本 选择第一个就好了 进去之后 根据自己的电脑选择就好 有64位和32位 点击torrent会生成种子 下载好种子之后 使用迅雷下载就好了 下载完成之
  • 十一.linux多线程同步之互斥锁、信号量、条件量

    笔记 https note youdao com ynoteshare1 index html id 1b529d966d34b16f3bdd828be48364e4 type note 目录 一 线程同步之信号量 1 任务 用户从终端输入
  • leetcode链表之反转链表

    本文主要有三道题 都是关于反转链表的算法题 由浅入深 文章出现的代码都是python3 206 反转链表 题目 给你单链表的头节点 head 请你反转链表 并返回反转后的链表 示例1 输入 head 1 2 3 4 5 输出 5 4 3 2
  • 基于MATLAB GUI的数字滤波仿真平台设计

    基于MATLAB GUI的数字滤波仿真平台设计 一 平台介绍 二 设计原理 1 登陆系统设计原理 2 IIR数字滤波器设计 3 FIR数字滤波器设计 三 程序实现 1 用户登陆系统程序 2 IIR DF设计 3 FIR DF设计 4 FDA
  • Pyinstaller打包exe附带图片的方法

    2019 10 27更新 在最近的wordpress项目中学到了图片字节码可在文件中存在 于是我做了试验并成功了 就是代码里带一堆字节码 参考 https blog csdn net jss19940414 article details
  • vue 路由守卫

    vue router 提供的导航守卫主要用来通过或取消的方式来守卫导航 有多种机会植入路由导航的过程 主要分为全局导航 单个路由导航 组件导航 所谓路由导航我们可以这么理解 导航守卫就相当于保安的意思 你要进入这个房子 保安需要知道你是 t