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 相关文章推荐
jquery animate图片模向滑动示例代码
Jan 26 Javascript
JavaScript中链式调用之研习
Apr 07 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
Apr 08 Javascript
使用jQuery清空file文件域的解决方案
Apr 12 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
Mar 04 Javascript
javascript常用方法总结
May 14 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
Feb 19 Javascript
JavaScript实现显示函数调用堆栈的方法
Apr 21 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
Nov 09 Javascript
vue动态禁用控件绑定disable的例子
Oct 28 Javascript
Vue axios 将传递的json数据转为form data的例子
Oct 29 Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 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
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
PHP通用分页类page.php[仿google分页]
2008/08/31 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
实例讲解php数据访问
2016/05/09 PHP
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
jQuery+Ajax实现限制查询间隔的方法
2016/06/07 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python实现局域网内实时通信代码
2019/12/22 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
Melissa香港官网:MDreams
2016/07/01 全球购物
初中同学聚会邀请函
2014/02/03 职场文书
批评与自我批评材料
2014/02/15 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python