vue2.0 实现导航守卫的具体用法(路由守卫)


Posted in Javascript onMay 17, 2018

路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。

对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards)。

导航守卫(navigation-guards)这个名字,听起来怪怪的,但既然官方文档是这样翻译的,就姑且这么叫吧。

贴上文档地址:https://router.vuejs.org/zh-cn/advanced/navigation-guards.html

全局守卫

你可以使用 router.beforeEach 注册一个全局前置守卫:

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
 // ...
})

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。

每个守卫方法接收三个参数:

  1. to: Route: 即将要进入的目标 路由对象
  2. from: Route: 当前导航正要离开的路由
  3. next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
    1. next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
    2. next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
    3. next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。
    4. next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved。

下面写一个例子:

1.列举需要判断登录状态的“路由集合”,当跳转至集合中的路由时,如果“未登录状态”,则跳转到登录页面LoginPage;

2.当直接进入登录页面LoginPage时,如果“已登录状态”,则跳转到首页HomePage;

import Vue from 'vue';
import Router from 'vue-router';
import LoginPage from '@/pages/login';
import HomePage from '@/pages/home';
import GoodsListPage from '@/pages/good-list';
import GoodsDetailPage from '@/pages/good-detail';
import CartPage from '@/pages/cart';
import ProfilePage from '@/pages/profile';
Vue.use(Router)
const router = new Router({
 routes: [
  {
   path: '/', // 默认进入路由
   redirect: '/home'  //重定向
  },
  {
   path: '/login',
   name: 'login',
   component: LoginPage
  },
  {
   path: '/home',
   name: 'home',
   component: HomePage
  },
  {
   path: '/good-list',
   name: 'good-list',
   component: GoodsListPage
  },
  {
   path: '/good-detail',
   name: 'good-detail',
   component: GoodsDetailPage
  },
  {
   path: '/cart',
   name: 'cart',
   component: CartPage
  },
  {
   path: '/profile',
   name: 'profile',
   component: ProfilePage
  },
  {
   path: '**',  // 错误路由
   redirect: '/home'  //重定向
  },
 ]
});

// 全局路由守卫
router.beforeEach((to, from, next) => {
 console.log('navigation-guards');
 // to: Route: 即将要进入的目标 路由对象
 // from: Route: 当前导航正要离开的路由
 // next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

 const nextRoute = ['home', 'good-list', 'good-detail', 'cart', 'profile'];
 let isLogin = global.isLogin; // 是否登录
 // 未登录状态;当路由到nextRoute指定页时,跳转至login
 if (nextRoute.indexOf(to.name) >= 0) { 
  if (!isLogin) {
   console.log('what fuck');
   router.push({ name: 'login' })
  }
 }
 // 已登录状态;当路由到login时,跳转至home 
 if (to.name === 'login') {
  if (isLogin) {
   router.push({ name: 'home' });
  }
 }
 next();
});

export default router;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
May 10 Javascript
javascript showModalDialog 内跳转页面的问题
Nov 25 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
Aug 08 Javascript
jquery 插件实现瀑布流图片展示实例
Apr 03 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
Jun 13 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
Sep 04 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
Sep 07 Javascript
JS+canvas画一个圆锥实例代码
Dec 13 Javascript
基于mpvue的小程序项目搭建的步骤
May 22 Javascript
JS字符串与二进制的相互转化实例代码详解
Jun 28 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
Aug 16 Javascript
关于JSON解析的实现过程解析
Oct 08 Javascript
通过一次报错详细谈谈Point事件
May 17 #Javascript
AngularJS日期格式化常见操作实例分析
May 17 #Javascript
Node 升级到最新稳定版的方法分享
May 17 #Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
May 17 #Javascript
AngularJS自定义过滤器用法经典实例总结
May 17 #Javascript
JS 实现分页打印功能
May 16 #Javascript
使用vue-cli导入Element UI组件的方法
May 16 #Javascript
You might like
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
Python导入txt数据到mysql的方法
2015/04/08 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
详解Python 函数参数的拆解
2020/09/02 Python
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
介绍一下Ruby的多线程处理
2013/02/01 面试题
《世界多美呀》教学反思
2014/03/02 职场文书
教研活动主持词
2015/07/03 职场文书
员工安全责任协议书
2016/03/22 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery
Golang实现AES对称加密的过程详解
2021/05/20 Golang
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
MySQL数据库必备之条件查询语句
2021/10/15 MySQL