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 匿名函数及其代码模式原理
Mar 19 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
Aug 07 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
Feb 11 Javascript
给应用部分的js代码设定一个统一的入口
Jun 15 Javascript
JavaScript中用字面量创建对象介绍
Dec 31 Javascript
最全面的JS倒计时代码
Sep 17 Javascript
javaScript手机号码校验工具类PhoneUtils详解
Dec 08 Javascript
AjaxUpLoad.js实现文件上传功能
Mar 02 Javascript
详解Angular6.0使用路由步骤(共7步)
Jun 29 Javascript
JavaScript遍历DOM元素的常见方式示例
Feb 16 Javascript
vue.js 子组件无法获取父组件store值的解决方式
Nov 08 Javascript
javascript使用canvas实现饼状图效果
Sep 08 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
用mysql内存表来代替php session的类
2009/02/01 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
python计数排序和基数排序算法实例
2014/04/25 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
python3操作mysql数据库的方法
2017/06/23 Python
Python日期的加减等操作的示例
2017/08/15 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
shell程序中如何注释
2012/02/17 面试题
高分子材料与工程专业个人求职信
2013/12/15 职场文书
培训自我鉴定
2014/01/31 职场文书
表彰会主持词
2014/03/26 职场文书
环保志愿者活动总结
2014/06/27 职场文书
老人节标语大全
2014/10/08 职场文书
政风行风整改方案
2014/10/25 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
运动会新闻稿
2015/07/17 职场文书
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
解析Java中的static关键字
2021/06/14 Java/Android
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers