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 window对象属性整理
Oct 24 Javascript
用Js实现的动态增加表格示例自己写的
Oct 21 Javascript
js调试系列 断点与动态调试[基础篇]
Jun 18 Javascript
JS获取及验证开始结束日期的方法
Aug 20 Javascript
常用的javascript设计模式
Jan 11 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
May 08 jQuery
关于定制FileField中的上传文件名称问题
Aug 22 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
Oct 25 Javascript
简单谈谈javascript高级特性
Sep 04 Javascript
vue实现节点增删改功能
Sep 26 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 Javascript
如何利用React实现图片识别App
Feb 18 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登陆页的密码处理方式分享
2013/10/14 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
小议javascript 设计模式 推荐
2009/10/28 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
js中的闭包实例展示
2018/11/01 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
英文求职信结束语大全
2013/10/26 职场文书
经典演讲稿范文
2013/12/30 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
如何写求职信
2014/05/24 职场文书
英语教育专业自荐信
2014/05/29 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
继承权公证书范本
2015/01/23 职场文书
2014年个人总结范文
2015/03/09 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python
基于PyQt5制作一个群发邮件工具
2022/04/08 Python