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 相关文章推荐
javascript下给元素添加事件的方法与代码
Aug 13 Javascript
jQuery对象和DOM对象的相互转化实现代码
Mar 02 Javascript
JS网页播放声音实现代码兼容各种浏览器
Sep 22 Javascript
JQuery实现倒计时按钮具体方法
Nov 14 Javascript
js+CSS实现弹出居中背景半透明div层的方法
Feb 26 Javascript
JavaScript实现快速排序的方法
Jul 31 Javascript
基于JQuery及AJAX实现名人名言随机生成器
Feb 10 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
Sep 02 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
Sep 27 Javascript
vue分页插件的使用方法
Dec 25 Javascript
Vue项目接入Paypal实现示例详解
Jun 04 Javascript
JS原型对象操作实例分析
Jun 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
博士208HAF收音机实习报告
2021/03/02 无线电
默默简单的写了一个模板引擎
2007/01/02 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
php cli换行示例
2014/04/22 PHP
纯php生成随机密码
2015/10/30 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
python3序列化与反序列化用法实例
2015/05/26 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
自主招生自荐信怎么写
2015/03/24 职场文书
孔繁森观后感
2015/06/10 职场文书
力克胡哲观后感
2015/06/10 职场文书
Java中的随机数Random
2022/03/17 Java/Android
redis复制有可能碰到的问题汇总
2022/04/03 Redis
MySQL分布式恢复进阶
2022/07/23 MySQL