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高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
Aug 14 Javascript
js获取字符串最后一位方法汇总
Nov 13 Javascript
javascript中对Date类型的常用操作小结
May 19 Javascript
聊一聊JS中this的指向问题
Jun 17 Javascript
bootstrap weebox 支持ajax的模态弹出框
Feb 23 Javascript
vue移动端UI框架实现QQ侧边菜单组件
Mar 09 Javascript
基于js Canvas实现二次贝塞尔曲线
Dec 25 Javascript
一些手写JavaScript常用的函数汇总
Apr 16 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
Apr 17 Javascript
ios中视频的最后一桢问题解决
May 14 Javascript
jquery.pager.js分页实现详解
Jul 29 jQuery
JS实现前端路由功能示例【原生路由】
May 29 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中单引号与双引号的区别分析
2014/08/19 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
Python实现动态循环输出文字功能
2020/05/07 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
经贸日语专业个人求职信
2013/12/13 职场文书
小学红领巾中秋节广播稿
2014/01/13 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
项目合作协议书
2014/09/23 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
2016特色励志班级口号
2015/12/24 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript