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 相关文章推荐
北京奥运官方网站幻灯切换效果flash版打包下载
Jan 30 Javascript
jquery.AutoComplete.js中文修正版(支持firefox)
Apr 09 Javascript
jQuery之网页换肤实现代码
Apr 30 Javascript
jquery attr 设定src中含有&(宏)符号问题的解决方法
Jul 26 Javascript
减少访问DOM的次数提升javascript性能
Feb 24 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
May 28 Javascript
js学习阶段总结(必看篇)
Jun 16 Javascript
AngularJS包括详解及示例代码
Aug 17 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
Nov 21 Javascript
vue组件之Alert的实现代码
Oct 17 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
Oct 19 Javascript
javascript数组去重方法总结(推荐)
Mar 20 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程序中的常见漏洞进行攻击
2006/10/09 PHP
PHP 变量的定义方法
2010/01/26 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
python多线程编程方式分析示例详解
2013/12/06 Python
python基础教程之lambda表达式使用方法
2014/02/12 Python
使用pdb模块调试Python程序实例
2015/06/02 Python
Python 中 Meta Classes详解
2016/02/13 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
使用python绘制二元函数图像的实例
2019/02/12 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
python实现桌面气泡提示功能
2019/07/29 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
python 实现音频叠加的示例
2020/10/29 Python
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
护理专业应届毕业生推荐信
2013/11/15 职场文书
工作睡觉检讨书
2014/02/25 职场文书
职位说明书范文
2014/05/07 职场文书
中学生运动会广播稿
2015/08/19 职场文书
个人向公司借款协议书
2016/03/19 职场文书