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-syntax动态语法着色示例代码
May 14 Javascript
让人蛋疼的JavaScript语法特性
Sep 30 Javascript
不用一句js代码初始化组件
Jan 27 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
Apr 17 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
Nov 07 Javascript
Vue.js如何优雅的进行form validation
Apr 07 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
May 24 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
Aug 25 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
Feb 03 Javascript
详解Node.js读写中文内容文件操作
Oct 10 Javascript
解决layui动态加载复选框无法选中的问题
Sep 20 Javascript
electron-vue开发环境内存泄漏问题汇总
Oct 10 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二分查找二种实现示例
2014/03/12 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
js实现文章目录索引导航(table of content)
2020/05/10 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
法学毕业生自我鉴定
2014/01/31 职场文书
班级体育活动总结
2014/07/05 职场文书
初中生毕业评语
2014/12/29 职场文书
仓库管理制度范本
2015/08/04 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
Python中的datetime包与time包包和模块详情
2022/02/28 Python
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫