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 相关文章推荐
jQuery EasyUI API 中文文档 - ComboBox组合框
Oct 07 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
Feb 16 Javascript
jQuery根据纬度经度查看地图处理程序
May 08 Javascript
js浮动图片的动态效果
Jul 10 Javascript
Node.js插件的正确编写方式
Aug 03 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
Mar 03 Javascript
使用bootstrap插件实现模态框效果
May 10 Javascript
JS设计模式之数据访问对象模式的实例讲解
Sep 30 Javascript
JsChart组件使用详解
Mar 04 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
Mar 12 Javascript
vue + elementUI实现省市县三级联动的方法示例
Oct 29 Javascript
Node.js API详解之 vm模块用法实例分析
May 27 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 var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
php新建文件的方法实例
2019/09/26 PHP
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
angular中的cookie读写方法
2017/08/02 Javascript
详解a++和++a的区别
2017/08/30 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
浅析为什么a="abc" 不等于 a=new String("abc")
2017/10/25 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
python字符串的方法与操作大全
2018/01/30 Python
python自动发送邮件脚本
2018/06/20 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
PHP面试题附答案
2015/11/28 面试题
车辆安全检查制度
2014/01/12 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
Python 中的Sympy详细使用
2021/08/07 Python