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 相关文章推荐
window.onbeforeunload方法在IE下无法正常工作的解决办法
Jan 23 Javascript
基于jquery的页面划词搜索JS
Sep 14 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
Nov 23 Javascript
Jquery中获取iframe的代码
Jan 11 Javascript
js图片延迟加载的实现方法及思路
Jul 22 Javascript
Javascript Web Slider 焦点图示例源码
Oct 10 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
Nov 22 Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 Javascript
Vue.js组件使用开发实例教程
Nov 01 Javascript
Vue-Router2.X多种路由实现方式总结
Feb 09 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
Mar 14 Javascript
JS数组的常用10种方法详解
May 08 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
header跳转和include包含问题详解
2012/09/08 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
YII路径的用法总结
2014/07/09 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
PHP实现文件上传与下载
2020/08/28 PHP
javascript fullscreen全屏实现代码
2009/04/09 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
python计算对角线有理函数插值的方法
2015/05/07 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
深入解析Python中的上下文管理器
2016/06/28 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
Python高斯消除矩阵
2019/01/02 Python
Python自带的IDE在哪里
2020/07/01 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
平面设计的岗位职责
2013/11/08 职场文书
商业房地产广告语
2014/03/13 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
小学捐书活动总结
2014/07/05 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
使用CSS实现音波加载效果
2023/05/07 HTML / CSS