Vuerouter的beforeEach与afterEach钩子函数的区别


Posted in Javascript onDecember 26, 2018

在路由跳转的时候,我们需要一些权限判断或者其他操作。这个时候就需要使用路由的钩子函数。

定义:路由钩子主要是给使用者在路由发生变化时进行一些特殊的处理而定义的函数。

总体来讲vue里面提供了三大类钩子,两种函数
1、全局钩子
2、某个路由的钩子
3、组件内钩子

两种函数:

1、Vue.beforeEach(function(to,form,next){}) /*在跳转之前执行*/

2.Vue.afterEach(function(to,form))/*在跳转之后判断*/

全局钩子函数

顾名思义,它是对全局有效的一个函数

router.beforeEach((to, from, next) => {

  let token = router.app.$storage.fetch("token");

  let needAuth = to.matched.some(item => item.meta.login);

  if(!token && needAuth) return next({path: "/login"});

  next();

});

beforeEach函数有三个参数:

  • to:router即将进入的路由对象
  • from:当前导航即将离开的路由
  • next:Function,进行管道中的一个钩子,如果执行完了,则导航的状态就是 confirmed (确认的);否则为false,终止导航。

afterEach函数不用传next()函数

某个路由的钩子函数

顾名思义,它是写在某个路由里头的函数,本质上跟组件内函数没有区别。

const router = new VueRouter({
 routes: [
  {
   path: '/login',
   component: Login,
   beforeEnter: (to, from, next) => {
    // ...
   },
   beforeLeave: (to, from, next) => {
    // ...
   }
  }
 ]
})

路由组件的钩子

注意:这里说的是路由组件!

路由组件 属于 组件,但组件 不等同于 路由组件!所谓的路由组件:直接定义在router中component处的组件。如:

var routes = [
  {
  path:'/home',
  component:home,
  name:"home"
  }
]

在子组件中调用路由的钩子函数时无效的。

在官方文档上是这样定义的:

可以在路由组件内直接定义以下路由导航钩子

  • beforeRouteEnter
  • beforeRouteUpdate (2.2 新增)
  • beforeRouteLeave

这里简单说下钩子函数的用法:它是和data,methods平级的。

beforeRouteLeave(to, from, next) {
  next()
},
beforeRouteEnter(to, from, next) {
  next()
},
beforeRouteUpdate(to, from, next) {
  next()
},
data:{},
method: {}

PS:在使用vue-router beforeEach钩子时,你也许会遇到如下问题:

源码:

router.beforeEach((to, from, next) => {
//判断登录状态简单实例
var userInfo = window.localStorage.getItem('token');
if (userInfo) {
next();
} else {
next('/login');
}
})

然后你会发现出现如下错误:出现dead loop错误

Vuerouter的beforeEach与afterEach钩子函数的区别

解决方案:

router.beforeEach((to, from, next) => {
var userInfo = window.localStorage.getItem('token');//获取浏览器缓存的用户信息
if(userInfo){ //如果有就直接到首页咯
next();
} else {
if(to.path=='/login'){ //如果是登录页面路径,就直接next()
next();
} else { //不然就跳转到登录;
next('/login');
}

}
})

解决思路:

排除此时地址 = 转向的地址 的情况,避免dead loop, 问题很简单,但一不小心就入坑了

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

Javascript 相关文章推荐
传智播客学习之JavaScript基础篇
Nov 13 Javascript
动态加载外部javascript文件的函数代码分享
Jul 28 Javascript
jQuery获取DOM节点实例分析(2种方式)
Dec 15 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
Jan 16 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
Jun 15 Javascript
vue.js实现简单轮播图效果
Oct 10 Javascript
详解JSONObject和JSONArray区别及基本用法
Oct 25 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
Nov 26 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 Javascript
微信小程序基于picker实现级联菜单
Feb 15 Javascript
vue 扩展现有组件的操作
Aug 14 Javascript
使用Sonarqube扫描Javascript代码的示例
Dec 26 #Javascript
angular6的table组件开发的实现示例
Dec 26 #Javascript
详解VUE里子组件如何获取父组件动态变化的值
Dec 26 #Javascript
JavaScript基础之静态方法和实例方法分析
Dec 26 #Javascript
微信小程序实现文字跑马灯
May 26 #Javascript
基于JavaScript canvas绘制贝塞尔曲线
Dec 25 #Javascript
基于js Canvas实现二次贝塞尔曲线
Dec 25 #Javascript
You might like
PHP面向对象编程快速入门
2006/10/09 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
PHP实现懒加载的方法
2015/03/07 PHP
PHP时间和日期函数详解
2015/05/08 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
php简单实现数组分页的方法
2016/04/30 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
JavaScript jQuery 中定义数组与操作及jquery数组操作
2015/12/18 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
python3图片转换二进制存入mysql
2013/12/06 Python
Python import用法以及与from...import的区别
2015/05/28 Python
Python实现简单http服务器
2018/04/12 Python
python进行两个表格对比的方法
2018/06/27 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
酒店司机岗位职责
2013/12/14 职场文书
财务总监岗位职责
2014/03/07 职场文书
员工年终自我评价
2014/09/14 职场文书
大四学生个人总结
2015/02/15 职场文书
天那边观后感
2015/06/09 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
PyTorch中的torch.cat简单介绍
2022/03/17 Python