vue 路由守卫(导航守卫)及其具体使用


Posted in Javascript onFebruary 25, 2020

最近在学习vue,感觉路由守卫这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记

官方文档

导航守卫其实也是路由守卫,也可以是路由拦截,我们可以通过路由拦截,来判断用户是否登录,该页面用户是否有权限浏览,需要结合meta来实现

vue中路由守卫一共有三种,一个全局路由守卫,一个是组件内路由守卫,一个是router独享守卫

所谓的路由守卫可以简单的理解为一座房子的门口的保安,想要进入这个房子就必须通过保安的检查,要告诉路由守卫你从哪里来?总不能随便陌生人就给放进去?要到哪里去?然后保安再告诉你下一步该怎么做?如果你的确是这个房子主人允许进入的人,那就让你进入,否则就要打电话给房子主人,跟房主商量(登录注册),给你权限。

// 通过这个匹配判断是否有该权限或要求,这个一般作为页面权限设置,比如哪些页面需要登录才能进入,哪些不需要
to.matched.some(res => res.meta.requireAuth)

一、全局路由守卫

所谓全局路由守卫,就是小区大门,整个小区就这一个大门,你想要进入其中任何一个房子,都需要经过这个大门的检查
全局路由守卫有个两个:一个是全局前置守卫,一个是全局后置守卫

router.beforeEach((to, from, next) => {
  console.log(to) => // 到哪个页面去?
  console.log(from) => // 从哪个页面来?
  next() => // 一个回调函数
}
router.afterEach(to,from) = {}

next():回调函数参数配置

next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址

next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: 'home' 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项

二、组件路由守卫

// 跟methods: {}等同级别书写,组件路由守卫是写在每个单独的vue文件里面的路由守卫
beforeRouteEnter (to, from, next) {
  // 注意,在路由进入之前,组件实例还未渲染,所以无法获取this实例,只能通过vm来访问组件实例
  next(vm => {})
}
beforeRouteUpdate (to, from, next) {
  // 同一页面,刷新不同数据时调用,
}
beforeRouteLeave (to, from, next) {
  // 离开当前路由页面时调用
}

三、路由独享守卫

路由独享守卫是在路由配置页面单独给路由配置的一个守卫

export default new VueRouter({
  routes: [
    {
      path: '/',
      name: 'home',
      component: 'Home',
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

vue-router提供了导航钩子:全局前置导航钩子 beforeEach和全局后置导航钩子 afterEach,他们会在路由即将改变前和改变后进行触发。所以判断用户是否登录需要在beforeEach导航钩子中进行判断。

导航钩子有3个参数:

  1、to:即将要进入的目标路由对象;

  2、from:当前导航即将要离开的路由对象;

  3、next :调用该方法后,才能进入下一个钩子函数(afterEach)。

        next()//直接进to 所指路由
        next(false) //中断当前路由
        next('route') //跳转指定路由
        next('error') //跳转错误路由

beforeEach:

路由配置文件:

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import HomePage from '@/pages/home.vue'
Vue.use(Router)
const router=new Router({
 routes: [
  {
   path: '/',
   name: 'HelloWorld',
   component: HelloWorld
  },
   {
   path: '/home',
   name: 'home',
   component: HomePage
  },
   {
    path:'*',
    redirect:'/home'
   }
 ],
})
 router.beforeEach((to,from,next)=>{
  console.log(to);
  console.log(from);
  next();
 })
 export default router;

打印结果如下:

vue 路由守卫(导航守卫)及其具体使用

 实现用户验证的代码:

router.beforeEach((to, from, next) => {
  //我在这里模仿了一个获取用户信息的方法
 let isLogin = window.sessionStorage.getItem('userInfo');
  if (isLogin) {
    //如果用户信息存在则往下执行。
    next()
  } else {
    //如果用户token不存在则跳转到login页面
    if (to.path === '/login') {
      next()
    } else {
      next('/login')
    }
  } 
})

afterEach:

和beforeEach不同的是afterEach不接收第三个参数 next 函数,也不会改变导航本身,一般beforeEach用的最多,afterEach用的少.

router.afterEach((to,from)=>{ //这里不接收next
  console.log(to);
  console.log(from);
})

到此这篇关于vue 路由守卫(导航守卫)及其具体使用的文章就介绍到这了,更多相关vue 路由守卫内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
提升你网站水平的jQuery插件集合推荐
Apr 19 Javascript
JQ获取动态加载的图片大小的正确方法分享
Nov 08 Javascript
javascript调试过程中找不到哪里出错的可能原因
Dec 16 Javascript
javascript使用onclick事件改变选中行的颜色
Dec 30 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
Aug 22 Javascript
原生javascript实现自动更新的时间日期
Feb 12 Javascript
完美解决JS文件页面加载时的阻塞问题
Dec 18 Javascript
js仿新浪微博消息发布功能
Feb 17 Javascript
如何以Angular的姿势打开Font-Awesome详解
Apr 22 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
Aug 14 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
Jan 30 Javascript
vue 使用post/get 下载导出文件操作
Aug 07 Javascript
Javascript地址引用代码实例解析
Feb 25 #Javascript
Javascript如何实现双指控制图片功能
Feb 25 #Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
Feb 25 #Javascript
通过js实现压缩图片上传功能
Feb 25 #Javascript
Vue实现简单计算器案例
Feb 25 #Javascript
使用Vue实现简单计算器
Feb 25 #Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 #Javascript
You might like
PHP编程风格规范分享
2014/01/15 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
Yii框架表单模型和验证用法
2016/05/20 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
2019/05/05 Javascript
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
浅谈python对象数据的读写权限
2016/09/12 Python
Python设置在shell脚本中自动补全功能的方法
2018/06/25 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
numpy数组广播的机制
2019/07/12 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
复古服装:RetroStage
2019/05/10 全球购物
开放系统互连参考模型
2016/06/29 面试题
人力资源经理的岗位职责范本
2014/02/28 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android