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 相关文章推荐
jQuery 获取URL参数的插件
Mar 04 Javascript
(function($){...})(jQuery)的意思
Jul 22 Javascript
jquery弹出关闭遮罩层实例
Aug 06 Javascript
JavaScript获得url查询参数的方法
Jul 02 Javascript
微信支付 JS API支付接口详解
Jul 11 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
Dec 26 Javascript
vue mixins组件复用的几种方式(小结)
Sep 06 Javascript
解决vue打包项目后刷新404的问题
Mar 06 Javascript
js canvas实现二维码和图片合成的海报
Nov 19 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
Oct 09 Javascript
小程序实现文字循环滚动动画
Jun 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
smarty获得当前url的方法分享
2014/02/14 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
Javascript----文件操作
2007/01/18 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
Python 中的with关键字使用详解
2016/09/11 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
python数据抓取3种方法总结
2021/02/07 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
Python面试题集
2012/03/08 面试题
警察思想汇报
2014/01/04 职场文书
信访工作者先进事迹
2014/01/17 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
完整版商业计划书
2014/09/15 职场文书
预备党员转正材料
2014/12/19 职场文书
产品质量保证书范本
2015/02/27 职场文书
Python中的 enumerate和zip详情
2022/05/30 Python