【发布时间】:2019-12-28 18:07:06
【问题描述】:
在我们的项目中,我们使用 Vuejs 和 Fabricjs,在画布上绘制一些东西并对其进行编辑等。
最近我们开始重构,我们认为如果我们将所有事件统一在一个事件总线下会很好。因为现在我们有 3 种类型的事件:vuejs 事件、fabricjs 画布事件、窗口事件。
所以我们创建了简单的 EventBus 类,如下所示:
import EventEmitter from 'events'
class EventBus extends EventEmitter {}
const eb = new EventBus()
export default eb
然后我们可以在任何地方导入这个事件总线,比如import eventBus from '@/EventBus'
所以通过使用这个事件总线,我们不是 vue 组件的类可以对这些事件做出反应,这些事件也可以在 vue 组件中发出或捕获。
现在我们还想将 fabricjs 事件传输到我们的事件总线,这将消除类(和 vue 组件)直接引用画布以注册其事件的需要。
假设我们将有一个类引用画布,我们会将事件传输到我们的事件总线,如下所示:
this._canvas.on({
'mouse:down': e => eventBus.emit('canvas:mouse:down', e),
'mouse:up': e => eventBus.emit('canvas:mouse:up', e)
})
虽然这可行,但我注意到它在处理诸如 mouse:moving 之类的事件时会产生一些性能开销,同时在画布上处理许多对象,这些事件被快速调用。
我的问题是,我们应该那样做吗?或者为所有类提供对画布的访问权限,以便它们都可以直接注册到其事件总线并删除从一个事件总线到另一个事件总线的“不必要”传输?
我的同事也想将窗口事件移动到我们的事件总线上,但这对我来说似乎更加错误,因为我们拥有的所有东西都可以访问窗口对象。
【问题讨论】:
标签: javascript vue.js fabricjs