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 相关文章推荐
JavaScript语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
Oct 24 Javascript
jQuery标签替换函数replaceWith()的使用例子
Aug 28 Javascript
JS实现一个按钮的方法
Feb 05 Javascript
JS实现的最简Table选项卡效果
Oct 14 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
Oct 17 Javascript
微信小程序 富文本转文本实例详解
Oct 24 Javascript
微信小程序 选项卡的简单实例
May 24 Javascript
详解ES6之用let声明变量以及let loop机制
Jul 15 Javascript
js实现点击按钮复制文本功能
Jul 20 Javascript
vue.js实现图书管理功能
Sep 24 Javascript
js实现内置计时器
Dec 16 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 破解防盗链图片函数
2008/12/09 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
js计数器代码
2006/11/04 Javascript
javascript下判断一个元素是否存在的代码
2010/03/05 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
让人期待的2011年度最佳 jQuery 插件分享
2012/03/16 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
js数组去重的方法汇总
2015/07/29 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
详解webpack babel的配置
2018/01/09 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
Python创建字典的八种方式
2019/02/27 Python
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
自荐信怎么写呢?
2013/12/09 职场文书
三年大学自我鉴定
2014/01/16 职场文书
银行职员自我鉴定
2014/04/20 职场文书
关于保护环境的建议书
2014/05/13 职场文书
售后服务承诺函格式
2015/01/21 职场文书
Android 中的类文件和类加载器详情
2022/06/05 Java/Android
python绘制云雨图raincloud plot
2022/08/05 Python