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 相关文章推荐
Prototype ObjectRange对象学习
Jul 19 Javascript
jquery ajax方式直接提交整个表单核心代码
Aug 15 Javascript
JavaScript实现的简单幂函数实例
Apr 17 Javascript
有关json_decode乱码及NULL的问题
Oct 13 Javascript
在JavaScript中对HTML进行反转义详解
May 18 Javascript
值得分享的bootstrap table实例
Sep 22 Javascript
jQuery remove()过滤被删除的元素(推荐)
Jul 18 jQuery
实例讲解Vue.js中router传参
Apr 22 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
Oct 12 Javascript
Angular事件之不同组件间传递数据的方法
Nov 15 Javascript
了解JavaScript中let语句
May 30 Javascript
详解Vue 的异常处理机制
Nov 30 Vue.js
通过一次报错详细谈谈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
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
Js中sort()方法的用法
2006/11/04 Javascript
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
2010/11/11 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
python函数的作用域及关键字详解
2019/08/20 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
python os.listdir()乱码解决方案
2021/01/31 Python
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
为什么需要版本控制?
2013/08/08 面试题
口头翻译求职人自荐信
2013/12/07 职场文书
省文明单位申报材料
2014/05/08 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
公司门卫工作职责
2014/06/28 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
详解Python中的进程和线程
2021/06/23 Python