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 相关文章推荐
jquery 滚动条事件简单实例
Jul 12 Javascript
javascript实现设置、获取和删除Cookie的方法
Jun 01 Javascript
JS获取下拉框显示值和判断单选按钮的方法
Jul 09 Javascript
jQuery遍历节点树方法分析
Sep 08 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
Jan 05 Javascript
详解vue跨组件通信的几种方法
Jun 15 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
Jun 07 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
Aug 24 Javascript
javascript系统时间设置操作示例
Jun 17 Javascript
在VUE style中使用data中的变量的方法
Jun 19 Javascript
如何使用JavaScript策略模式校验表单
Apr 29 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 ftp文件上传函数(基础版)
2010/06/03 PHP
微盾PHP脚本加密专家php解密算法
2020/09/13 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
简单的php购物车代码
2020/06/05 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
python获得文件创建时间和修改时间的方法
2015/06/30 Python
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
Django1.7+python 2.78+pycharm配置mysql数据库
2016/10/09 Python
python使用opencv进行人脸识别
2017/04/07 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
内业资料员岗位职责
2014/01/04 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android