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实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
Oct 24 Javascript
jquery判断元素是否隐藏的多种方法
May 06 Javascript
jquery.cookie.js用法实例详解
Dec 25 Javascript
学习JavaScript设计模式之模板方法模式
Jan 20 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
Jan 11 Javascript
微信小程序 首页制作简单实例
Apr 07 Javascript
vue获取dom元素注意事项
Dec 28 Javascript
ES6的Fetch异步请求的实现方法
Dec 07 Javascript
微信小程序实现商城倒计时
Nov 01 Javascript
js实现页面图片消除效果
Mar 24 Javascript
Vue实现跑马灯效果
May 25 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函数解决SQL injection
2006/12/09 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
php微信开发之关注事件
2018/06/14 PHP
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
2018/09/28 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
PyMongo安装使用笔记
2015/04/27 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
python中selenium库的基本使用详解
2020/07/31 Python
python批量修改文件名的示例
2020/09/27 Python
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
个人简历自荐信
2013/12/05 职场文书
原料仓管员岗位职责
2014/04/12 职场文书
竞聘自述材料
2014/08/25 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
初中信息技术教学反思
2016/02/16 职场文书
标准发言稿结尾
2019/07/18 职场文书