Vue基础系列(二十一)——全局事件总线(GlobalEventBus)
Posted 勇敢*牛牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue基础系列(二十一)——全局事件总线(GlobalEventBus)相关的知识,希望对你有一定的参考价值。
全局事件总线(GlobalEventBus)
对于一般的全局事件总线需要一个所有成员都能看见的组件(路人x)。首先能想到的是window对象,只要是浏览器就有这个window.
比如在入口文件main.js里创建一个window对象:
然后在组件里通过钩子来调出数据
用加号连接对象会显示object,因为连接的是字符串,用逗号就会单独的把数据对象输出。
但是再一想,我是为了让所有的组件看见我的这个路人x,那我们的组件不就是vc嘛,vc是从何而来的?不就是Vuecomponent
new 出来的嘛。……只要我在Vuecomponent的原型对象上方一个x,但是Vuecomponent是真实存在的嘛?不是的,他是Vue.extend生成的。
所以说:
vueComponent.prototype.x = a:1,b:2
这个写法本身就是错误的,而更加不可能的是对源码进行一个修改。
那根据对原型的溯源,可以知道组件的来源new Vuecomponnet,而Vuecomponnet来自VUe.extend();所以这个的来源就是如下代码:
const Demo = Vue.extend();
const d = new Demo();
Vue.prototype.x = d
哥哥
mounted()
// console.log("school:",this.x);
this.x.$on('hello',(data)=>
console.log('我是school组件,收到了数据',data);
)
弟弟
methods:
sendStudentName()
this.x.$emit('hello',666);
基本实现同级数据互传
还或者可以这样写;
利用生命周期钩子来实现,beforeCreate()
生命周期函数,在未创建之前就把这个$bus(总线)给处理好。
new Vue(
el: '#app',
render: h => h(App),
beforeCreate()
Vue.prototype.$bus = this //安装全局事件总线
// Vue.prototype.x = this;
,
)
但是如果弃用这个组件的话就要开始把这个占用的bus销毁掉
// 销毁组件之前解除傀儡身上的事件绑定
beforeDestroy()
this.$bus.$off("hello")
,
-
一种组件间通信的方式,适用于任意组件间通信。
-
安装全局事件总线:
new Vue( ...... beforeCreate() Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm , ...... )
-
使用事件总线:
-
接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。
methods: demo(data)...... ...... mounted() this.$bus.$on('xxxx',this.demo)
-
提供数据:
this.$bus.$emit('xxxx',数据)
-
-
最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。
以上是关于Vue基础系列(二十一)——全局事件总线(GlobalEventBus)的主要内容,如果未能解决你的问题,请参考以下文章
Vue 快速入门系列Vue数据实现本地存储自定义事件绑定全局事件总线$nextTick的使用