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 相关文章推荐
学习YUI.Ext 第二天
Mar 10 Javascript
jQuery实现点击标题输入详细信息
Apr 16 Javascript
js 对小数加法精度处理示例说明
Dec 27 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
Jan 02 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
Jun 12 Javascript
javascript中返回顶部按钮的实现
May 05 Javascript
JavaScript中Boolean对象的属性解析
Oct 21 Javascript
javascript针对cookie的基本操作实例详解
Nov 30 Javascript
简要了解jQuery移动web开发的响应式布局设计
Dec 04 Javascript
Angular的事件和表单详解
Dec 26 Javascript
JavaScript如何借用构造函数继承
Nov 06 Javascript
微信小程序收藏功能的实现代码
Jun 19 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
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
PHP实现变色验证码实例
2014/01/06 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
layui实现三级导航菜单
2019/07/26 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
Python的垃圾回收机制深入分析
2014/07/16 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
numpy返回array中元素的index方法
2018/06/27 Python
详解Python字典的操作
2019/03/04 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
python第三方库学习笔记
2020/02/07 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
建筑行业的大学生自我评价
2013/12/08 职场文书
广告语设计及教案
2014/03/21 职场文书