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 相关文章推荐
图片上传即时显示缩略图的js代码
May 27 Javascript
javascript 表单验证常见正则
Sep 28 Javascript
jQuery 添加/移除CSS类实现代码
Feb 11 Javascript
读jQuery之三(构建选择器)
Jun 11 Javascript
鼠标放在图片上显示大图的JS代码
Mar 26 Javascript
JavaScript中的值类型详细介绍
Dec 29 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
May 12 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
Aug 28 Javascript
Node.js中的require.resolve方法使用简介
Apr 23 Javascript
运用jQuery写的验证表单(实例讲解)
Jul 06 jQuery
Vue.set()实现数据动态响应的方法
Feb 07 Javascript
vue自定义标签和单页面多路由的实现代码
May 03 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的源码中深入了解stdClass类
2014/04/18 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
python中去空格函数的用法
2014/08/21 Python
详解flask入门模板引擎
2018/07/18 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
win10安装python3.6的常见问题
2020/07/01 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
Pretty Green美国:英式摇滚服饰风格代表品牌之一
2019/01/23 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
欢迎横幅标语
2014/06/17 职场文书
节能减耗标语
2014/06/21 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
公司委托书范本5篇
2014/09/20 职场文书
课改心得体会范文
2016/01/25 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python