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 相关文章推荐
自动检查并替换文本框内的字符
Jun 30 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
Aug 06 Javascript
JavaScript获取onclick、onchange等事件值的代码
Jul 22 Javascript
移动设备web开发首选框架:zeptojs介绍
Jan 29 Javascript
js判断登录与否并确定跳转页面的方法
Jan 30 Javascript
jquery调整表格行tr上下顺序实例讲解
Jan 09 Javascript
JS实现简单的二维矩阵乘积运算
Jan 26 Javascript
Angularjs中的ui-bootstrap的使用教程
Feb 19 Javascript
详解Node.js开发中的express-session
May 19 Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 Javascript
JS sort方法基于数组对象属性值排序
Jul 10 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
Oct 12 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
德生PL660的电路分析和打磨
2021/03/02 无线电
PHP 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
PHP中$_SERVER的详细参数与说明
2008/07/29 PHP
PHP模块memcached使用指南
2014/12/08 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
Python使用filetype精确判断文件类型
2017/07/02 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
pytz格式化北京时间多出6分钟问题的解决方法
2019/06/21 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
iPython pylab模式启动方式
2020/04/24 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
X/HTML5 和 XHTML2
2008/10/17 HTML / CSS
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
会计系毕业个人自荐信格式
2013/09/23 职场文书
汽车运用工程毕业生自荐信
2013/10/29 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
运动会邀请函范文
2014/02/06 职场文书
全国文明单位申报材料
2014/05/31 职场文书
检讨书范文300字
2015/01/28 职场文书
班主任自我评价范文
2015/03/11 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android