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多选项卡效果实例代码(附效果图)
Mar 23 Javascript
Javascript 命名空间模式
Nov 01 Javascript
探讨JavaScript语句的执行过程
Jan 28 Javascript
解析AngularJS中get请求URL出现的跨域问题
Dec 01 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
Mar 09 Javascript
AngularJS 最常用的八种功能(基础知识)
Jun 26 Javascript
详解JS模块导入导出
Dec 20 Javascript
微信小程序实现简单表格
Feb 14 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
Feb 22 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
Sep 05 Javascript
jquery实现垂直手风琴导航栏
Feb 18 jQuery
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
Jul 27 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代码
2006/12/06 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
javascript dom代码应用 简单的相册[firefox only]
2010/06/12 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
ajax java 实现自动完成功能
2012/12/19 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
python snownlp情感分析简易demo(分享)
2017/06/04 Python
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
详解python和matlab的优势与区别
2019/06/28 Python
python定位xpath 节点位置的方法
2019/08/27 Python
基于Pytorch SSD模型分析
2020/02/18 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
2014年高三毕业生自我评价
2014/01/11 职场文书
简历的自我评价范文
2014/02/04 职场文书
致裁判员加油稿
2014/02/08 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
专题组织生活会方案
2014/06/15 职场文书
自查自纠工作总结
2014/10/15 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle
MySQL查询日期时间
2022/05/15 MySQL
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL