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中对于DOM的加强
Apr 11 Javascript
JS获得选取checkbox整行数据的方法
Jan 28 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
Jan 08 Javascript
学习JavaScript事件流和事件处理程序
Jan 25 Javascript
javascript常用的设计模式
Feb 09 Javascript
关于js中的鼠标事件总结
Jul 11 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
Oct 14 jQuery
React 组件中的 bind(this)示例代码
Sep 16 Javascript
微信小程序分享海报生成的实现方法
Dec 10 Javascript
Windows下Node爬虫神器Puppeteer安装记
Jan 09 Javascript
ES6基础之展开语法(Spread syntax)
Feb 21 Javascript
jquery插件实现图片悬浮
Apr 16 jQuery
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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
js的写法基础分析
2011/01/17 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
解析Vue.js中的组件
2018/02/02 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
Python实现简单截取中文字符串的方法
2015/06/15 Python
python利用datetime模块计算时间差
2015/08/04 Python
python自动翻译实现方法
2016/05/28 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
Python 求数组局部最大值的实例
2019/11/26 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
客服专员岗位职责
2014/02/28 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android
python flappy bird小游戏分步实现流程
2022/02/15 Python
Python 文字识别
2022/05/11 Python