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优化尝试小结
Feb 06 Javascript
利用js实现遮罩以及弹出可移动登录窗口
Jul 08 Javascript
Js操作Select大全(取值、设置选中等等)
Oct 29 Javascript
JavaScript调用客户端的可执行文件(示例代码)
Nov 28 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
Mar 27 Javascript
jQuery下拉美化搜索表单效果代码分享
Aug 25 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
Sep 18 Javascript
详解从新建vue项目到引入组件Element的方法
Aug 29 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
Jan 03 Javascript
又拍云 Node.js 实现文件上传、删除功能
Oct 28 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
Jan 24 Javascript
react国际化react-intl的使用
May 06 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
php对mongodb的扩展(初出茅庐)
2012/11/11 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
详解PHP数组赋值方法
2015/11/07 PHP
基于javascript实现图片滑动效果
2016/05/07 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
Postman内建变量常用方法实例解析
2020/07/28 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
让python json encode datetime类型
2010/12/28 Python
python动态参数用法实例分析
2015/05/25 Python
jupyter安装小结
2016/03/13 Python
关于python写入文件自动换行的问题
2018/06/23 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
python调用win32接口进行截图的示例
2020/11/11 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
实用求职信范文分享
2013/12/25 职场文书
策划创业计划书
2014/02/06 职场文书
货车司机岗位职责
2014/03/18 职场文书
求职自荐信的格式
2014/04/07 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
优秀员工演讲稿
2014/05/19 职场文书
销售提升方案
2014/06/07 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
干部作风建设工作总结
2014/10/29 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书
刑事申诉状范文
2015/05/20 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
总结会主持词
2015/07/02 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python