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 CSS菜单功能 改进版
Dec 20 Javascript
JS实现状态栏跑马灯文字效果代码
Oct 24 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
微信公众号支付H5调用支付解析
Nov 04 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
Jul 08 jQuery
JS中正则表达式要注意lastIndex属性
Aug 08 Javascript
原生JS实现简单的无缝自动轮播效果
Sep 26 Javascript
vue项目中实现图片预览的公用组件功能
Oct 26 Javascript
详解webpack 最简打包结果分析
Feb 20 Javascript
使用apifm-wxapi模块中的问题及解决方法
Aug 05 Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 Javascript
基于elementUI竖向表格、和并列的案例
Oct 26 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
我的论坛源代码(三)
2006/10/09 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
7个Javascript地图脚本整理
2009/10/20 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
python实现给字典添加条目的方法
2014/09/25 Python
python显示生日是星期几的方法
2015/05/27 Python
Python实现批量下载图片的方法
2015/07/08 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
python如何实现代码检查
2019/06/28 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
Python基于paramunittest模块实现excl参数化
2020/04/26 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
计算机应用专业推荐信
2013/11/13 职场文书
演讲稿开场白
2014/01/13 职场文书
12岁生日感言
2014/01/21 职场文书
高中家长寄语
2014/04/02 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python