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 相关文章推荐
javascript 尚未实现错误解决办法
Nov 27 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
Jan 15 Javascript
JavaScript设计模式之单例模式实例
Sep 24 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
Dec 24 Javascript
限制只能输入数字的实现代码
May 16 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
Sep 14 Javascript
webuploader模态框ueditor显示问题解决方法
Dec 27 Javascript
vue.js element-ui tree树形控件改iview的方法
Mar 29 Javascript
vuex进阶知识点巩固
May 20 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
Aug 31 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
Oct 09 jQuery
Vue SPA 首屏优化方案
Feb 26 Vue.js
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
ThinkPHP多表联合查询的常用方法
2020/03/24 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
python修改注册表终止360进程实例
2014/10/13 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
Hibernate持久层技术
2013/12/16 面试题
学生会个人自荐书范文
2014/02/12 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
公开承诺书格式
2014/05/21 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
考试作弊检讨
2015/01/27 职场文书
个人维稳承诺书
2015/05/04 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python