Vue手把手教你撸一个 beforeEnter 钩子函数


Posted in Javascript onApril 24, 2018

为什么要自造beforeEnter钩子函数?

看下问题场景:项目中有一单词列表页面,每个cell都会备注该单词是否已经掌握,点击cell进入详情页,可对该单词进行学习,并标记单词是否掌握,并且在详情页面中也可以通过点击前进 后退 按钮学习其他的单词。所以但我点击返回时,单词列表要展示所有单词用户掌握的最新情况。

最终的页面关系是这样的:

​ wordListPage ——> wordDetail (对一系列单词进行学习,退出)——> wordListPage(刷新单词列表)

对于上面的场景,使用Vue生命周期函数是不行的,因为Vue的生命周期函数如:beforeCreate 、created、beforeMounted、mounted等,只有在组件初始化的时候才会被调用,但是当组件(VM实例)来自于缓存(如$route.go(-1) 、keep-alive)中时,生命周期函数将不会再被调用。因此,当我从单词详情页面返回至列表页面时,找不到一个恰当的时期去出发数据更新。所以上面的场景也就无法很好的去做处理。

当然,对于上面的场景是比较少的,但是beforeEnter钩子函数的存在还是有必要的。

构造beforeEnter钩子函数

依赖知识点:

  1. 路由:vue-router  
  2. 混入:mixin  
  3. 中央事件总线

1.创建一个中央事件总线

对于中央事件总线,简单理解,就是创建一个公共Vue实例(EventBus),在不同的地方使用相同实例触发EventBus.$emit('demo') 消息,在想要监听事件的位置使用公共Vue实例进行监听EventBus.$on('demo',() => {})。再说白点,就是有这么一个公共组件,它会再不同的地方发消息,又在不同的地方自己去监听消息。所以说消息的发送和接收都是它自己实现的,所以说我们称之为中央事件总线。

代码如下:libs/EventBus.js

import Vue from 'vue';
const EventBus = new Vue();
export default EventBus;

下面看下怎么使用

2.路由钩子函数beforeEach

通过beforeEach钩子函数,实现路由切换时触发相应组件的beforeEnter事件。

代码如下:router/index.js

import EventBus from '@/libs/EventBus';

router.beforeEach((to, from, next) => {
  //如:EventBus.$emit('homeBeforeEnter');
  EventBus.$emit(to.name + 'BeforeEnter');
  
  if (to.matched.some(route => route.meta.isAuth)) {
    ...
    next()
  } else {
    next()
  }
  
})

3.创建全局混入对象

这里实现路由切换事件的监听和组件实例钩子函数beforeEnter的触发。

libs/beforeEnterMixin.js

import EventBus from './EventBus';

export default {
  beforeCreate() {
    //获取当前路由名称,与前面使用to.name对应
    let vmName = this.$route.name;
    if (!vmName) {
      return;
    }
    // 当组件初始化时,先触发一次,后续将不再调用
    this.$options.beforeEnter();
    const beforeEnter = vmName + 'BeforeEnter';
    //监听路由切换时触发的...BeforeEnter事件
    //通过this.$options获取到实例中的beforeEnter钩子函数
    //监听到...BeforeEnter事件后,触发钩子函数beforeEnter调用
    EventBus.$on(beforeEnter, this.$options.beforeEnter);
  },
  //该函数在这里只作为占位,没有实际意义
  beforeEnter() {}
};

对于该混入对象,使用全局或者局部混入都是可行的。

全局混入:main.js

import beforeEnterMixin from '@/libs/beforeEnterMixin';
Vue.mixin(beforeEnterMixin);

4.在组件中的使用

如:home.vue

<template>
  <div>
    首页
  </div>
</template>
<script>
export default {
  beforeEnter() {
    console.log('首页 beforeEnter...');
  },
  created() {
    console.log('首页 created...')
  }
}
</script>

至此,我们的 beforeEnter 就完成了,可以做个demo自己测试下,目前本人在项目比较多的地方都会用到它。

在此附上以上代码的demo链接:https://github.com/chaoshenr/Vue-beforeEnter

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使javascript也能包含文件
Oct 26 Javascript
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
Jan 12 Javascript
利用div+jquery自定义滚动条样式的2种方法
Jul 18 Javascript
JS连连看源码完美注释版(推荐)
Dec 09 Javascript
JavaScript组合拼接字符串的效率对比测试
Nov 06 Javascript
JS 数字转换为大写金额的简单实例
Aug 04 Javascript
解析预加载显示图片艺术
Dec 05 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
Mar 09 Javascript
Vue.js 表单控件操作小结
Mar 29 Javascript
vue项目前端埋点的实现
Mar 06 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
Sep 06 Javascript
js单线程的本质 Event Loop解析
Oct 29 Javascript
js 图片转base64的方式(两种)
Apr 24 #Javascript
react配合antd组件实现的管理系统示例代码
Apr 24 #Javascript
详解开发react应用最好用的脚手架 create-react-app
Apr 24 #Javascript
vue webpack实用技巧总结
Apr 24 #Javascript
浅谈vue中.vue文件解析流程
Apr 24 #Javascript
vue-cli2.9.3 详细教程
Apr 23 #Javascript
vue.js数据绑定操作详解
Apr 23 #Javascript
You might like
PHP setcookie() cannot modify header information 的解决方法
2009/01/09 PHP
处理php自动反斜杠的函数代码
2010/01/05 PHP
php表单提交问题的解决方法
2011/04/12 PHP
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
js静态作用域的功能。
2006/12/25 Javascript
Div自动滚动到末尾的代码
2008/10/26 Javascript
Prototype Number对象 学习
2009/07/19 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
Python callable()函数用法实例分析
2018/03/17 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
python动态规划算法实例详解
2020/11/22 Python
python 使用openpyxl读取excel数据
2021/02/18 Python
美国精油公司:Plant Therapy
2019/05/17 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
入党积极分子思想汇报
2014/01/02 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
节约用电标语
2014/06/17 职场文书
护理专科学生自荐书
2014/07/05 职场文书
医德医魂心得体会
2014/09/11 职场文书
热血教师观后感
2015/06/10 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏