vue采用EventBus实现跨组件通信及注意事项小结


Posted in Javascript onJune 14, 2018

EventBus

EventBus是一种发布/订阅事件设计模式的实践。

在vue中适用于跨组件简单通信,不适应用于复杂场景多组件高频率通信,类似购物车等场景状态管理建议采用vuex。

vue采用EventBus实现跨组件通信及注意事项小结

挂载EventBus到vue.prototype

添加bus.js文件

//src/service/bus.js
export default (Vue) => {
 const eventHub = new Vue()
 Vue.prototype.$bus = {
 /**
  * @param {any} event 第一个参数是事件对象,第二个参数是接收到消息信息,可以是任意类型
  * @method $on 事件订阅, 监听当前实例上的自定义事件。https://cn.vuejs.org/v2/api/#vm-on
  * @method $off 取消事件订阅,移除自定义事件监听器。 https://cn.vuejs.org/v2/api/#vm-off https://github.com/vuejs/vue/issues/3399
  * @method $emit 事件广播, 触发当前实例上的事件。 https://cn.vuejs.org/v2/api/#vm-emit
  * @method $once 事件订阅, 监听一个自定义事件,但是只触发一次,在第一次触发之后移除监听器。 https://cn.vuejs.org/v2/api/#vm-once
  */
  $on (...event) {
   eventHub.$on(...event)
  },
  $off (...event) {
   eventHub.$off(...event)
  },
  $once (...event) {
   eventHub.$emit(...event)
  },
  $emit (...event) {
   eventHub.$emit(...event)
  }
 }
}
注册
//main.js
import BUS from './service/bus'
BUS(Vue)

注意事项

  1. 事件订阅必须在事件广播前注册;
  2. 取消事件订阅必须跟事件订阅成对出现。

使用场景

1.跨路由组件使用eventbus通信

假设a路由跳转b路由需要通过eventbus通信,先观察路由跳转前后a,b组件的生命周期钩子函数,可以发现两者是交叉执行的。

由于事件订阅必须在事件广播前注册,所以事件订阅可以放在b组件beforeCreate,created,beforeMout钩子函数中,而事件广播可以放在a组件的beforeDestroy,destroyed中。

取消事件订阅必须跟事件订阅成对出现,否则会重复订阅,对javascript性能造成不必要的浪费。因此B组件销毁前需取消当前事件订阅。

vue采用EventBus实现跨组件通信及注意事项小结

A组件

beforeDestroy () {
  //事件广播
   this.$bus.$emit('testing', color)
  }

B组件

created () {
  //事件订阅
   this.$bus.$on('testing', (res) => { console.log(res) })
  },
  beforeDestroy () {
   this.$bus.$off('testing')
  }

2.普通跨组件通信:由于两组件几乎同时加载,因此建议事件广播放在created钩子内,事件订阅放在mouted中即可。具体使用场景建议在两组件分别打印生命钩子函数进行准确判断。

beforeCreate: function () {
  console.group('A组件 beforeCreate 创建前状态===============》')
 },
 created: function () {
  console.group('A组件 created 创建完毕状态===============》')
 },
 beforeMount: function () {
  console.group('x组件 beforeMount 挂载前状态===============》')
 },
 mounted: function () {
  console.group('x组件 mounted 挂载结束状态===============》')
 },
 beforeUpdate: function () {
  console.group('x组件 beforeUpdate 更新前状态===============》')
 },
 updated: function () {
  console.group('x组件 updated 更新完成状态===============》')
 },
 beforeDestroy: function () {
  console.group('x组件 beforeDestroy 销毁前状态===============》')
 },
 destroyed: function () {
  console.group('x组件 destroyed 销毁完成状态===============》')
 }

总结

以上所述是小编给大家介绍的vue采用EventBus实现跨组件通信及注意事项小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS实现点击链接取消跳转效果的方法
Jan 24 Javascript
jQuery实现购物车表单自动结算效果实例
Aug 10 Javascript
js实现无缝循环滚动
Jun 23 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
Sep 08 Javascript
JS实现六边形3D拖拽翻转效果的方法
Sep 11 Javascript
Bootstrap select多选下拉框实现代码
Dec 23 Javascript
jQuery插件zTree实现删除树子节点的方法示例
Mar 08 Javascript
bootstrap table服务端实现分页效果
Aug 10 Javascript
angular写一个列表的选择全选交互组件的示例
Jan 22 Javascript
layui 弹出删除确认界面的实例
Sep 06 Javascript
在JavaScript中实现链式调用的实现
Dec 24 Javascript
简介JavaScript错误处理机制
Aug 04 Javascript
JS对象与json字符串相互转换实现方法示例
Jun 14 #Javascript
微信小程序左滑动显示菜单功能的实现
Jun 14 #Javascript
vue中如何让子组件修改父组件数据
Jun 14 #Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 #Javascript
MVVM框架下实现分页功能示例
Jun 14 #Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
Jun 14 #jQuery
React 组件间的通信示例
Jun 14 #Javascript
You might like
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
重新认识php array_merge函数
2014/08/31 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
jQuery之网页换肤实现代码
2011/04/30 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
python中精确输出JSON浮点数的方法
2014/04/18 Python
python的Template使用指南
2014/09/11 Python
Python编码爬坑指南(必看)
2016/06/10 Python
Django的分页器实例(paginator)
2017/12/01 Python
Python Gitlab Api 使用方法
2019/08/28 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
pyspark 随机森林的实现
2020/04/24 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
一套比较完整的软件测试人员面试题
2012/05/13 面试题
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
保险公司开门红口号
2014/06/21 职场文书
环境科学专业求职信
2014/08/04 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
环卫个人总结
2015/03/03 职场文书
写给老师的保证书
2015/05/09 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书