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(一)工厂方式 js面象对象的定义方法
Dec 15 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
Apr 12 Javascript
js判断游览器类型及版本号的代码
May 11 Javascript
javascript对中文按照拼音排序代码
Aug 20 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
Sep 06 Javascript
Flash图片上传组件 swfupload使用指南
Mar 14 Javascript
初步认识JavaScript函数库jQuery
Jun 18 Javascript
BootStrap实现树形目录组件代码详解
Jun 21 Javascript
Bootstrap Validator 表单验证
Jul 25 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
Oct 19 Javascript
Angular的事件和表单详解
Dec 26 Javascript
新手快速入门JavaScript装饰者模式与AOP
Jun 24 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会话的安全性分析
2011/09/08 PHP
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
基于jQuery的表格操作插件
2010/04/22 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
JS作用域深度解析
2016/12/29 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
Vue-Router实现组件间跳转的三种方法
2017/11/07 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
小程序实现悬浮搜索框
2019/07/12 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
Python创建日历实例
2014/08/21 Python
Python itertools模块详解
2015/05/09 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
python使用tornado实现简单爬虫
2018/07/28 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
Python爬取网页信息的示例
2020/09/24 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
学生学习总结的自我评价
2013/10/22 职场文书
工商管理专业应届生求职信
2013/11/04 职场文书
装饰活动策划方案
2014/02/11 职场文书
餐厅开业活动方案
2019/07/08 职场文书