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 indexOf使用方法
Aug 19 Javascript
原生javaScript实现图片延时加载的方法
Dec 22 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
Dec 28 Javascript
js实现延时加载Flash的方法
Nov 26 Javascript
jQuery ready()和onload的加载耗时分析
Sep 08 Javascript
JavaScript实现自动切换图片代码
Oct 11 Javascript
canvas 弹幕效果(实例分享)
Jan 11 Javascript
微信小程序 Animation实现图片旋转动画示例
Aug 22 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
详解小程序如何避免多次点击,重复触发事件
Apr 08 Javascript
JavaScript Window窗口对象属性和使用方法
Jan 19 Javascript
Vue自定义表单内容检查rules实例
Oct 30 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四大安全策略
2014/03/12 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
微信小程序npm引入vant-weapp的踩坑记录
2019/08/01 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
python3序列化与反序列化用法实例
2015/05/26 Python
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
公司领导推荐信
2013/11/12 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
作文评语集锦大全
2014/04/23 职场文书
小学家长学校培训材料
2014/08/24 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python
如何使用SQL Server语句创建表
2022/04/12 SQL Server