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 相关文章推荐
自动检查并替换文本框内的字符
Jun 30 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
Nov 24 Javascript
JavaScript 面向对象的 私有成员和公开成员
May 13 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
Sep 02 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
Jan 24 Javascript
用javascript关闭本窗口技巧小结
Sep 05 Javascript
Jquery代码实现图片轮播效果(一)
Aug 12 Javascript
javascript中FOREACH数组方法使用示例
Mar 01 Javascript
getElementById().innerHTML与getElementById().value的区别
Oct 27 Javascript
使用vue.js编写蓝色拼图小游戏
Mar 17 Javascript
Vue中多元素过渡特效的解决方案
Feb 05 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
Mar 09 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
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
php 发送带附件邮件示例
2014/01/23 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
一些Python中的二维数组的操作方法
2015/05/02 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
简单实现python进度条脚本
2017/12/18 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
2019/04/29 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
pygame实现飞机大战
2020/03/11 Python
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
C#基础面试题
2016/10/17 面试题
企业管理培训感言
2014/01/27 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
本科毕业生求职信
2014/06/15 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
慰问信模板
2015/02/14 职场文书
英语辞职信范文
2015/02/28 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL