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 相关文章推荐
JS事件在IE与FF中的区别详细解析
Nov 20 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
Oct 31 Javascript
Javascript基础教程之比较操作符
Jan 18 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
Dec 30 Javascript
jQuery通过deferred对象管理ajax异步
May 20 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
Vue数据驱动模拟实现2
Jan 11 Javascript
javascript 中事件冒泡和事件捕获机制的详解
Sep 01 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
Apr 30 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
May 21 Javascript
js的Object.assign用法示例分析
Mar 05 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
Aug 06 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
德生S2000电路分析
2021/03/02 无线电
用PHP创建PDF中文文档
2006/10/09 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
Prototype使用指南之selector.js说明
2008/10/26 Javascript
javascript hashtable实现代码
2009/10/13 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
JS实现点击按钮后框架内载入不同网页的方法
2015/05/05 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
JavaScript实现的拼图算法分析
2019/02/13 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
python中私有函数调用方法解密
2016/04/29 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
pycharm安装和首次使用教程
2018/08/27 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
Python的条件锁与事件共享详解
2019/09/12 Python
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
python上selenium的弹框操作实现
2020/07/13 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
最新英语专业学生求职信范文
2013/09/21 职场文书
大四自我鉴定范文
2013/10/06 职场文书
自考生自我评价分享
2014/01/18 职场文书
岗位标兵事迹材料
2014/05/17 职场文书