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在线混淆器
Dec 18 Javascript
[原创]后缀就扩展名为js的文件是什么文件
Dec 06 Javascript
初学JavaScript_03(ExtJs Grid的简单使用)
Oct 02 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
May 17 Javascript
探讨js中的双感叹号判断
Nov 11 Javascript
jquery操作checked属性以及disabled属性的多种方法
Jun 20 Javascript
JS前端加密算法示例
Dec 22 Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 Javascript
vue父子组件的数据传递示例
Mar 07 Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 Javascript
在vue中使用express-mock搭建mock服务的方法
Nov 07 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
Jan 02 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与javascript对多项选择的处理
2006/10/09 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
php实现encode64编码类实例
2015/03/24 PHP
PHP Reflection API详解
2015/05/12 PHP
Jquery下attr和removeAttr的使用方法
2010/12/28 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
理解javascript回调函数
2014/12/28 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
[00:10]DOTA2全国高校联赛 以DOTA2会友
2018/05/30 DOTA
python实现百万答题自动百度搜索答案
2018/01/16 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
python实现飞行棋游戏
2020/02/05 Python
Python dict的常用方法示例代码
2020/06/23 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
高三语文教学反思
2014/01/15 职场文书
学校运动会广播稿
2014/10/11 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
大学运动会通讯稿
2015/07/18 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS