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 相关文章推荐
基于Jquery的动态添加控件并取值的实现代码
Sep 24 Javascript
jQuery的slideToggle方法实例
May 07 Javascript
使用js解决由border属性引起的div宽度问题
Nov 26 Javascript
JavaScript修改css样式style动态改变元素样式
Dec 16 Javascript
js判断某个方法是否存在实例代码
Jan 10 Javascript
浅谈javascript中for in 和 for each in的区别
Apr 23 Javascript
详解AngularJS中自定义指令的使用
Jun 17 Javascript
详解jQuery-each()方法
Mar 13 jQuery
微信小程序云开发详细教程
May 16 Javascript
详细教你微信公众号正文页SVG交互开发技巧
Jul 25 Javascript
详解JavaScript中的this指向问题
Feb 05 Javascript
js实现弹框效果
Mar 24 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
isset和empty的区别
2007/01/15 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
jquery foreach使用示例
2013/09/12 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
django自带调试服务器的使用详解
2019/08/29 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
澳大利亚买卖正宗二手奢侈品交易平台:Luxe.It.Fwd
2019/10/16 全球购物
机电一体化应届生求职信范文
2014/01/24 职场文书
采购部长岗位职责
2014/06/13 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
社团个人总结范文
2015/03/05 职场文书
高三物理教学反思
2016/02/20 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
深入浅析React中diff算法
2021/05/19 Javascript
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS