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 相关文章推荐
js null,undefined,字符串小结
Aug 21 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
Nov 22 Javascript
关于JavaScript对象的动态选择及遍历对象
Mar 10 Javascript
javascript中eval解析JSON字符串
Feb 27 Javascript
实践中学习AngularJS表单
Mar 21 Javascript
理解Angular的providers给Http添加默认headers
Jul 04 Javascript
运用jQuery写的验证表单(实例讲解)
Jul 06 jQuery
node前端开发模板引擎Jade的入门
May 11 Javascript
关于Vue组件库开发详析
Jul 01 Javascript
Vue.js特性Scoped Slots的浅析
Feb 20 Javascript
Vue 使用beforeEach实现登录状态检查功能
Oct 31 Javascript
详解Vue的sync修饰符
May 15 Vue.js
使用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
phpmyadmin操作流程
2006/10/09 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
YII框架http缓存操作示例
2019/04/29 PHP
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
flexigrid 参数说明
2010/11/23 Javascript
正负小数点后两位浮点数实现原理及代码
2013/09/06 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
Python3.x中自定义比较函数
2015/04/24 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
python实战教程之自动扫雷
2018/07/13 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
树莓派实现移动拍照
2019/06/22 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
爱与责任演讲稿
2014/05/20 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
小学课外阅读总结
2014/07/09 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书