class EventBusEvent extends Event {
public data: any
constructor({type, data} : {type: string, data: any}) {
super(type)
this.data = data
}
}
class EventBus extends EventTarget {
private static _instance: EventBus
public static getInstance() : EventBus {
if (!this._instance) this._instance = new EventBus()
return this._instance
}
public emit(type : string, data?: any) : void {
this.dispatchEvent(new EventBusEvent({type, data}))
}
}
export default EventBus.getInstance()
项目中用法,发出事件:
import EventBus from '...path to eventbus file with class'
//...bla bla bla... code...
EventBus.emit('event type', {..some data..}')
侦听器事件:
import EventBus from '...path to eventbus file with class'
//...bla bla bla... code...
EventBus.addEventListener('event type', (event) => { console.log(event.data) })
6条答案
按热度按时间rekjcdws1#
正如官方文档中所建议的,您可以使用mitt库在组件之间调度事件,假设我们有一个侧边栏和
header
,其中包含一个关闭/打开侧边栏的按钮,我们需要该按钮来切换侧边栏组件中的某些属性:在main.js中,导入该库并创建该发射器的示例,并定义为全局属性:
安装:
用法:
in header发出带有某些有效负载的
toggle-sidebar
事件:在侧栏中接收带有有效负载的事件:
对于那些使用组合API的用户,他们可以使用
emitter
,如下所示:创建一个文件src/composables/useEmitter.js
从这里开始,您可以像使用
useRouter
一样使用useEmitter
:使用合成API
您还可以利用新的组合API并定义可组合的事件总线:
在组分A中:
组分B:
k5hmc34c2#
在Vue.js版本3中,您可以使用第三方库,也可以使用以发布者-订阅者(PubSub概念)编程模式编写的功能。
event.js
index.js
aiazj4mn3#
EventBus类文件的内容:
项目中用法,发出事件:
侦听器事件:
ogsagwnx4#
我已经修改了another answer,使其具有与Vue示例等效的接口,这样该实用程序就可以作为一个直接的替代品工作,而不需要更改使用的代码。
此版本还支持
$off
方法,该方法的第一个参数是事件名称的 array。它还避免了$off
方法中的一个问题,即取消注册多个事件侦听器实际上会删除一个错误的侦听器,这是因为在正向迭代数组的同时还删除了其中的项目。event-bus.js
:old-event-bus.js
:example.js
:oogrdqng5#
我只想在这里提到,您也可以使用VueUse定义的useEventBus。
下面是一个使用注入键的TypeScript示例。
第一个
oxosxuxt6#
借助Vue合成和defineEmit,您甚至可以使其变得更简单:
第一个
我只是用一个孩子演示了它,但是你可以把emit函数传递给其他孩子。