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 27 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
Aug 24 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
原生JavaScript实现瀑布流布局
Jun 28 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
Oct 28 Javascript
jQuery动态生成不规则表格(前后端)
Feb 21 Javascript
微信小程序实现根据字母选择城市功能
Aug 16 Javascript
JS实现可视化文件上传
Sep 08 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
May 13 Javascript
swiper4实现移动端导航切换
Oct 16 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
Feb 19 Javascript
JavaScript 实现页面滚动动画
Apr 24 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
解放web程序员的输入验证
2006/10/06 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
2015/07/15 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
Python 列表的清空方式
2020/01/13 Python
python exit出错原因整理
2020/08/31 Python
详解Python模块化编程与装饰器
2021/01/16 Python
生产主管岗位职责
2013/11/10 职场文书
优秀护士事迹材料
2014/12/25 职场文书
保卫工作个人总结
2015/03/03 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
MySQL transaction事务安全示例讲解
2022/06/21 MySQL
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技