vue-router 实现导航守卫(路由卫士)的实例代码


Posted in Javascript onSeptember 02, 2018

导航守卫

导航守卫即是在路由跳转的时候,根据vue-router提供的导航守卫主要用来通过跳转或取消参数或查询的改变并不会出触发进入/离开的导航守卫

路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。

对此,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。

下面写一个例子:

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;

总结

以上所述是小编给大家介绍的vue-router 实现导航守卫(路由卫士)的实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
iis6+javascript Add an Extension File
Jun 13 Javascript
jquery 触发a链接点击事件解决方案
May 02 Javascript
jquery js 重置表单 reset()具体实现代码
Aug 05 Javascript
file控件选择上传文件确定后触发的js事件是哪个
Mar 17 Javascript
JS函数重载的解决方案
May 13 Javascript
javascript显式类型转换实例分析
Apr 25 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
Dec 10 Javascript
详解JS中Array对象扩展与String对象扩展
Jan 07 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
Jun 26 Javascript
基于javascript实现按圆形排列DIV元素(二)
Dec 02 Javascript
使用selenium抓取淘宝的商品信息实例
Feb 06 Javascript
基于elementUI竖向表格、和并列的案例
Oct 26 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 #Javascript
解决Vue 项目打包后favicon无法正常显示的问题
Sep 01 #Javascript
修改vue+webpack run build的路径方法
Sep 01 #Javascript
解决vue项目使用font-awesome,build后路径的问题
Sep 01 #Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
Sep 01 #Javascript
解决vue 项目引入字体图标报错、不显示等问题
Sep 01 #Javascript
解决在vue项目中webpack打包后字体不生效的问题
Sep 01 #Javascript
You might like
php disk_free_space 返回目录可用空间
2010/05/10 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
smarty中常用方法实例总结
2015/08/07 PHP
Laravel 5.3 学习笔记之 错误&日志
2016/08/28 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
javaScript 关闭浏览器 (不弹出提示框)
2010/01/31 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
详解webpack babel的配置
2018/01/09 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
利用Python如何生成随机密码
2016/04/20 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
会计岗位职责
2013/11/08 职场文书
会计学专业学生的求职信范文
2014/01/27 职场文书
医院检讨书范文
2014/02/01 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
纪录片信仰观后感
2015/06/08 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
MySQL GRANT用户授权的实现
2021/06/18 MySQL