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读写(删除)Cookie实例详解
Apr 17 Javascript
jQuery中[attribute^=value]选择器用法实例
Dec 31 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 Javascript
Javascript数组Array方法解读
Mar 13 Javascript
简单理解JavaScript中的封装与继承特性
Mar 19 Javascript
Javascript如何判断数据类型和数组类型
Jun 22 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
Jul 12 Javascript
jQuery简单实现中间浮窗效果
Sep 04 Javascript
AngularJS 2.0入门权威指南
Oct 08 Javascript
详谈js原型继承的一些问题
Sep 06 Javascript
vue-路由精讲 二级路由和三级路由的作用
Aug 06 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中模拟链表和链表的基本操作示例
2016/02/27 PHP
JavaScript 参考教程
2006/12/29 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
javascript如何创建对象
2016/08/29 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
Vue基础配置讲解
2019/11/29 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python控制台显示时钟的示例
2014/02/24 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
Django logging配置及使用详解
2019/07/23 Python
什么是python的列表推导式
2020/05/26 Python
Django视图类型总结
2021/02/17 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
法人授权委托书范本
2014/04/04 职场文书
装修公司管理制度
2015/08/05 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
护理自荐信
2019/05/14 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS