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字符串拼接的效率问题
Dec 25 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
Aug 13 Javascript
jQuery 文本框得失焦点的简单实例
Feb 19 Javascript
js实现ArrayList功能附实例代码
Oct 29 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
May 07 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
原生JS实现层叠轮播图
May 17 Javascript
JS实现基于拖拽改变物体大小的方法
Jan 23 Javascript
vue给组件传递不同的值方法
Sep 29 Javascript
AngularJS $http post 传递参数数据的方法
Oct 09 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
Apr 10 Javascript
如何利用React实现图片识别App
Feb 18 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数组转xml的代码分享
2015/05/14 PHP
php fread函数使用方法总结
2019/05/28 PHP
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
Es6 Generator函数详细解析
2018/02/24 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
Python中文竖排显示的方法
2015/07/28 Python
python中执行shell的两种方法总结
2017/01/10 Python
python与C互相调用的方法详解
2017/07/14 Python
Python实现12306火车票抢票系统
2019/07/04 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
python数据抓取3种方法总结
2021/02/07 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
德国高性价比网上药店:medpex
2017/07/09 全球购物
如何设置Java的运行环境
2013/04/05 面试题
主管职责范文
2013/11/09 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
团队精神的演讲稿
2014/05/14 职场文书
2016春节慰问信范文
2015/03/25 职场文书
奖励申请报告范文
2015/05/15 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
python ansible自动化运维工具执行流程
2021/06/24 Python