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 相关文章推荐
学习ExtJS 访问容器对象
Oct 07 Javascript
jquery动态增加删除表格行的小例子
Nov 14 Javascript
JS仿百度搜索自动提示框匹配查询功能
Nov 21 Javascript
JavaScript动态修改网页元素内容的方法
Mar 21 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
Jun 24 Javascript
javascript实现平滑无缝滚动
Aug 09 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
May 10 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
Jan 18 Javascript
详解layui中的树形关于取值传值问题
Jan 16 Javascript
layui layer select 选择被遮挡的解决方法
Sep 21 Javascript
selenium+java中用js来完成日期的修改
Oct 31 Javascript
如何基于js判断浏览器版本
Feb 20 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命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
JS中表单的使用小结
2014/01/11 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
Python 内置函数complex详解
2016/10/23 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
python代码xml转txt实例
2020/03/10 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
实习生个人找工作的自我评价
2013/10/30 职场文书
门卫工作岗位职责
2013/12/17 职场文书
经济管理专业毕业生自荐信范文
2014/01/02 职场文书
网上蛋糕店创业计划书
2014/01/24 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
交通安全教育主题班会
2015/08/12 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android