vue2.0 实现导航守卫(路由守卫)


Posted in Javascript onMay 21, 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 完之前一直处于 等待中。

每个守卫方法接收三个参数:

to: Route: 即将要进入的目标 路由对象

from: Route: 当前导航正要离开的路由

next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。

next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved。

下面写一个例子:

列举需要判断登录状态的“路由集合”,当跳转至集合中的路由时,如果“未登录状态”,则跳转到登录页面LoginPage;

当直接进入登录页面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;

总结

以上所述是小编给大家介绍的vue2.0 实现导航守卫(路由守卫),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
初学JavaScript_03(ExtJs Grid的简单使用)
Oct 02 Javascript
JS获取IP、MAC和主机名的五种方法
Nov 14 Javascript
jquery自定义函数的多种方法
Jan 09 Javascript
JS取request值以及自动执行使用示例
Feb 24 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
Apr 25 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
Apr 25 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
Jan 04 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
Feb 25 Javascript
js实现(全选)多选按钮的方法【附实例】
Mar 30 Javascript
AngularJS实现动态切换样式的方法分析
Jun 26 Javascript
node.js 模块和其下载资源的镜像设置的方法
Sep 06 Javascript
Vue 监听元素前后变化值实例
Jul 29 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
May 21 #Javascript
JavaScript实现一个带AI的井字棋游戏源码
May 21 #Javascript
Vue中父子组件通讯之todolist组件功能开发
May 21 #Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
May 21 #Javascript
纯JS实现可用于页码更换的飞页特效示例
May 21 #Javascript
JS实现的文件拖拽上传功能示例
May 21 #Javascript
以v-model与promise两种方式实现vue弹窗组件
May 21 #Javascript
You might like
PHP性能优化 产生高度优化代码
2011/07/22 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
php7安装yar扩展的方法详解
2017/08/03 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
nodejs使用express获取get和post传值及session验证的方法
2017/11/09 NodeJs
vue实现中部导航栏布局功能
2019/07/30 Javascript
Vue中computed及watch区别实例解析
2020/08/01 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
Python库安装速度过慢解决方案
2020/07/14 Python
python中_del_还原数据的方法
2020/12/09 Python
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
啤酒节策划方案
2014/05/28 职场文书
个性车贴标语
2014/06/24 职场文书
党员志愿者活动总结
2014/06/26 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
如何在CSS中绘制曲线图形及展示动画
2021/05/24 HTML / CSS
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
灵能百分百第三季什么时候来?
2022/03/15 日漫