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的合并表格中相同文本的相邻单元格的代码
Apr 06 Javascript
基于JQuery的Select选择框的华丽变身
Aug 23 Javascript
jQuery新的事件绑定机制on()示例应用
Jul 18 Javascript
浅析javascript函数表达式
Feb 10 Javascript
javascript 将共享属性迁移到原型中去的实现方法
Aug 31 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
Aug 03 Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
Feb 06 Javascript
JavaScript插入排序算法原理与实现方法示例
Aug 06 Javascript
iview同时验证多个表单问题总结
Sep 29 Javascript
微信小程序中转义字符的处理方法
Mar 28 Javascript
webpack优化之代码分割与公共代码提取详解
Nov 22 Javascript
详解jQuery的核心函数和事件处理
Feb 18 jQuery
通过一次报错详细谈谈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
9个PHP开发常用功能函数小结
2011/07/15 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
jquery 查找新建元素代码
2010/07/06 Javascript
web前端开发也需要日志
2010/12/09 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
Javascript window对象详解
2014/11/12 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
Python的lambda匿名函数的简单介绍
2013/04/25 Python
用python写asp详细讲解
2013/12/16 Python
Python3处理文件中每个词的方法
2015/05/22 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
《莫高窟》教学反思
2014/02/25 职场文书
说明书怎么写
2014/05/06 职场文书
大学课外活动总结
2014/07/09 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
保险内勤岗位职责
2015/04/13 职场文书
利用javaScript处理常用事件详解
2021/04/14 Javascript