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 使用手册(一)
Sep 23 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
Dec 16 Javascript
js动态拼接正则表达式的两种方法
Mar 04 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
Dec 29 Javascript
jQuery中$.each()函数的用法引申实例
May 12 Javascript
jQuery插件zTree实现删除树节点的方法示例
Mar 08 Javascript
Angular服务Request异步请求的实例讲解
Aug 13 Javascript
基于Webpack4和React hooks搭建项目的方法
Feb 05 Javascript
微信小程序用canvas画图并分享
Mar 09 Javascript
node运行js获得输出的三种方式示例详解
Jul 02 Javascript
Node.js实现断点续传
Jun 23 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+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
js实现点击生成随机div
2020/01/16 Javascript
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
python3的输入方式及多组输入方法
2018/10/17 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
在pycharm中显示python画的图方法
2019/08/31 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
python的pip有什么用
2020/06/17 Python
巴西在线鞋店:Shoestock
2017/10/28 全球购物
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
关于是否需要写商业计划书
2014/02/07 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
2015年副班长工作总结
2015/05/15 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫