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 autocomplete自动完成插件的的使用方法
Aug 07 Javascript
jquery插件制作教程 txtHover
Aug 17 Javascript
jQuery遍历Table应用示例
Apr 09 Javascript
简单介绍JavaScript的变量和数据类型
Jun 03 Javascript
jquery实现的点击翻书效果代码
Nov 04 Javascript
webpack+vue.js实现组件化详解
Oct 12 Javascript
原生javascript实现的ajax异步封装功能示例
Nov 03 Javascript
JavaScript中的工厂函数(推荐)
Mar 08 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
webpack使用 babel-loader 转换 ES6代码示例
Aug 21 Javascript
vue element table 表格请求后台排序的方法
Sep 28 Javascript
手把手教您实现react异步加载高阶组件
Apr 07 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/25 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
js prototype截取字符串函数
2010/04/01 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
Python将多个list合并为1个list的方法
2018/06/27 Python
pyqt5 使用label控件实时显示时间的实例
2019/06/14 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
Python 面向对象部分知识点小结
2020/03/09 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
电焊工岗位职责
2014/03/06 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
民主评议党员总结
2014/10/20 职场文书
小学生作文批改评语
2014/12/25 职场文书
外科护士长工作总结
2015/08/12 职场文书
旷工检讨书大全
2015/08/15 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers