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 27 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
DOM基础教程之使用DOM
Jan 19 Javascript
Javascript实现div层渐隐效果的方法
May 30 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
Sep 12 Javascript
jQuery中常用动画效果函数(日常整理)
Sep 17 Javascript
JavaScript函数基础详解
Feb 03 Javascript
JavaScript实现滑动导航栏效果
Aug 30 Javascript
vue mixins组件复用的几种方式(小结)
Sep 06 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
Dec 14 Javascript
jQuery实现基本动画效果的方法详解
Sep 06 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
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
php上传文件问题汇总
2015/01/30 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
Python中int()函数的用法浅析
2017/10/17 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
关于毕业的广播稿
2014/01/10 职场文书
入学申请自荐信范文
2014/02/26 职场文书
广告宣传策划方案
2014/05/21 职场文书
2016高考感言
2015/08/01 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers