vue路由守卫及路由守卫无限循环问题详析


Posted in Javascript onSeptember 05, 2019

先贴一波官方文档的内容

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

然后这是我自己的总结

import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/pages/login/Login'
import Index from '../pages/index/Index'
import Library from '../pages/library/Library'
import Design from '../pages/design/Design'
import Administration from '../pages/administration/Administration'
import Production from '../pages/production/Production'

import Global from '../common/global/Global'

Vue.use(Router)

const router = new Router({
 routes: [
 {
  path: '/',
  name: 'login',
  component: Login
 }, {
  path: '/index',
  name: 'index',
  component: Index
 }, {
  path: '/library',
  name: 'library',
  component: Library
 }, {
  path: '/design',
  name: 'design',
  component: Design
 }, {
  path: '/administration',
  name: 'administration',
  component: Administration
 }, {
  path: '/production',
  name: 'production',
  component: Production
 }
 ]
})

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()
 }
 
})

export default router

这样就实现了全局路由守卫

关于路由守卫无限循环问题

如果你的代码是这样

if(isLogin) {
 next()
 } else {
 next({ name: 'login')}
 }

这样的话就会陷入无限循环

因为你的   next({ name: 'login')} 是相当于一个路由跳转,它会再次触发全局路由守卫,你又进入了全局路由守卫进行再次判断,如此循环。

所以,想要结束路由守卫,整段代码的逻辑必须由 next() 进行结尾。比如像我上面写的,当需要进入登录页的时候,

if(to.name === 'login') { 
 next() 
 return 
 }

加上这个判断,当你进入登录页的时候也会调用next() , 路由守卫进入确认状态,路由才会进行跳转

以上就是我在学习vue-router的路由守卫的总结

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
屏蔽相应键盘按钮操作
Mar 10 Javascript
对之前写的jquery分页做下升级
Jun 19 Javascript
js创建对象的方式总结
Jan 10 Javascript
JS实现文字掉落效果的方法
May 06 Javascript
JavaScript中reduce()方法的使用详解
Jun 09 Javascript
基于jQuery实现动态数字展示效果
Aug 12 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
Dec 04 Javascript
实现React单页应用的方法详解
Aug 02 Javascript
详解react、redux、react-redux之间的关系
Apr 11 Javascript
在 Vue.js中优雅地使用全局事件的方法
Feb 01 Javascript
jQuery实现的隔行变色功能【案例】
Feb 18 jQuery
微信小程序左右滚动公告栏效果代码实例
Sep 16 Javascript
关于JS解构的5种有趣用法
Sep 05 #Javascript
vue draggable resizable gorkys与v-chart使用与总结
Sep 05 #Javascript
JavaScript获取某一天所在的星期
Sep 05 #Javascript
layui table设置某一行的字体颜色方法
Sep 05 #Javascript
微信小程序HTTP接口请求封装代码实例
Sep 05 #Javascript
layui table去掉右侧滑动条的实现方法
Sep 05 #Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
Sep 05 #Javascript
You might like
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
js 文件引入实现代码
2010/04/23 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
js获取鼠标点击的位置实现思路及代码
2014/05/09 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
Python中关于字符串对象的一些基础知识
2015/04/08 Python
python实现中文输出的两种方法
2015/05/09 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
Python Opencv图像处理基本操作代码详解
2020/08/31 Python
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
专科毕业生自我鉴定
2013/12/01 职场文书
家长通知书家长评语
2014/04/17 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
校长个人总结
2015/03/03 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
跳高加油稿
2015/07/21 职场文书
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
Python实现8种常用抽样方法
2021/06/27 Python
我去timi了,一起去timi是什么意思?
2022/04/13 杂记
Redis+AOP+自定义注解实现限流
2022/06/28 Redis