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 offsetX与layerX区别
Mar 12 Javascript
深入探密Javascript数组方法
Jan 08 Javascript
javascript结合CSS实现苹果开关按钮特效
Apr 07 Javascript
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
JS简单实现点击跳转登陆邮箱功能的方法
Oct 31 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
Dec 27 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
vue项目打包部署_nginx代理访问方法详解
Sep 20 Javascript
基于vue写一个全局Message组件的实现
Aug 15 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 Javascript
js实现贪吃蛇游戏 canvas绘制地图
Sep 09 Javascript
vue实现input输入模糊查询的三种方式
Aug 14 Vue.js
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
Zend的AutoLoad机制介绍
2012/09/27 PHP
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
python去掉行尾的换行符方法
2017/01/04 Python
python中的随机函数小结
2018/01/27 Python
python format 格式化输出方法
2018/07/16 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
2020/02/17 Python
如何用python免费看美剧
2020/08/11 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
在什么时候需要使用"常引用"
2015/12/31 面试题
汇源肾宝广告词
2014/03/20 职场文书
代理协议书
2014/04/22 职场文书
保证书范文大全
2014/04/28 职场文书
白莲教口号
2014/06/18 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
学前班教学反思
2016/02/24 职场文书
python 单机五子棋对战游戏
2022/04/28 Python