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 相关文章推荐
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
Oct 23 Javascript
使用jquery实现放大镜效果
Sep 02 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
Feb 02 Javascript
javascript实现树形菜单的方法
Jul 17 Javascript
jQuery实现的简单提示信息插件
Dec 08 Javascript
js滑动提示效果代码分享
Mar 10 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
Feb 14 Javascript
jquery编写日期选择器
Mar 16 Javascript
Vue.js 父子组件通信的十种方式
Oct 30 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
Dec 18 Javascript
Layer+Echarts构建弹出层折线图的方法
Sep 25 Javascript
ant design实现圈选功能
Dec 17 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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
javascript设置文本框光标的方法实例小结
2016/11/04 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
django基于restframework的CBV封装详解
2019/08/08 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
python如何删除文件、目录
2020/06/23 Python
pytorch实现查看当前学习率
2020/06/24 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
机械专业个人求职自荐信格式
2013/09/21 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
倡议书格式模板
2014/05/13 职场文书
施工安全责任书范本
2014/07/24 职场文书
党委班子剖析材料
2014/08/21 职场文书
2015年资料员工作总结
2015/04/25 职场文书
客户答谢会致辞
2015/07/30 职场文书
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫