vue2.0 实现导航守卫的具体用法(路由守卫)


Posted in Javascript onMay 17, 2018

路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。

对此,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 完之前一直处于 等待中。

每个守卫方法接收三个参数:

  1. to: Route: 即将要进入的目标 路由对象
  2. from: Route: 当前导航正要离开的路由
  3. next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
    1. next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
    2. next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
    3. next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。
    4. 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;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 图片裁剪技巧解读
Nov 15 Javascript
jquery中插件实现自动添加用户的具体代码
Nov 15 Javascript
动态显示可输入的字数提示还可以输入的字数
Apr 01 Javascript
cookie的secure属性详解
Apr 08 Javascript
JavaScript Ajax编程 应用篇
Jul 02 Javascript
AngularJS基础 ng-list 指令详解及示例代码
Aug 02 Javascript
AngularJS动态加载模块和依赖的方法分析
Nov 08 Javascript
js单页hash路由原理与应用实战详解
Aug 14 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
Sep 05 Javascript
vue实现图片加载完成前的loading组件方法
Feb 05 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
Nov 06 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
Jul 20 Javascript
通过一次报错详细谈谈Point事件
May 17 #Javascript
AngularJS日期格式化常见操作实例分析
May 17 #Javascript
Node 升级到最新稳定版的方法分享
May 17 #Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
May 17 #Javascript
AngularJS自定义过滤器用法经典实例总结
May 17 #Javascript
JS 实现分页打印功能
May 16 #Javascript
使用vue-cli导入Element UI组件的方法
May 16 #Javascript
You might like
自动生成文章摘要的代码[PHP 版本]
2007/03/20 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
详解PHP中的PDO类
2015/07/06 PHP
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
Python中使用PIPE操作Linux管道
2015/02/04 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
Python如何生成树形图案
2018/01/03 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
Python实现随机漫步功能
2018/07/09 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
学习Python需要哪些工具
2020/09/04 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
美国在线印刷公司:PsPrint
2017/10/12 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
大学生安全责任书
2014/07/25 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
大学生党员个人总结
2015/02/13 职场文书
转正申请报告格式
2015/05/15 职场文书
初二英语教学反思
2016/02/15 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL