vuejs、fabricjs和window的事件处理
Event handling of vuejs, fabricjs and window
在我们的项目中,我们使用 Vuejs 和 Fabricjs 来绘制一些东西 canvas 并对其进行编辑等
最近我们开始重构,我们决定,如果我们将所有事件统一在一个事件总线下就好了。因为现在我们有 3 种类型的事件:vuejs 事件、fabricjs canvas 事件、window 事件。
所以我们创建了简单的 EventBus class 像这样:
import EventEmitter from 'events'
class EventBus extends EventEmitter {}
const eb = new EventBus()
export default eb
然后我们可以像 import eventBus from '@/EventBus'
这样的任何地方导入这个事件总线
因此,通过使用此事件总线,我们的 class 不是 vue 组件的 es 可以对这些事件做出反应,并且这些事件也可以在 vue 组件中发出或捕获。
现在我们也想将 fabricjs 事件传输到我们的事件总线,这将消除 classes(和 vue 组件)直接引用 canvas 进行注册的需要参加活动。
所以假设我们将有一个 class,其中我们引用了 canvas,我们将像这样将事件传输到我们的事件总线:
this._canvas.on({
'mouse:down': e => eventBus.emit('canvas:mouse:down', e),
'mouse:up': e => eventBus.emit('canvas:mouse:up', e)
})
虽然这有效,但我注意到它在 mouse:moving
等事件上有一些性能开销,同时在 canvas 上处理许多对象,其中事件被称为快速。
我的问题是,我们应该那样做吗?或提供所有 classes 对 canvas 的访问权限,以便它们都可以直接注册到其事件总线并删除此 'unnecessary' 从一个事件总线到另一个事件总线的传输?
我的同事也想将 window 事件移动到我们的事件总线,但这对我来说似乎更加错误,因为我们拥有的所有东西都可以访问 window 对象。
在 fabricjs 的特殊情况下 canvas,这种操作应该不会那么昂贵。
鼠标移动时的 fabricjs 事件执行一些标准操作,这些操作与您拥有的对象数量有轻微关系。
这些操作是:
提取鼠标位置和一些加法、乘法以获得 canvas 相对坐标。遍历对象并查看对象是否与该坐标相交。将事件处理程序绑定到 canvas 实例并调用它。
您的事件转发应该是免费的。
说的对不对,要看项目。如果清晰的代码和组织的好处超过了额外的函数包装,那么它就有意义了。
例如,在任何地方导入您的 canvas 实例以使其可访问,会将您的事件处理程序绑定到那个特定的 canvas,您的代码将开始以困难的方式引用它你想在你的项目中添加另一个 canvas 你可能有麻烦了。
在我们的项目中,我们使用 Vuejs 和 Fabricjs 来绘制一些东西 canvas 并对其进行编辑等
最近我们开始重构,我们决定,如果我们将所有事件统一在一个事件总线下就好了。因为现在我们有 3 种类型的事件:vuejs 事件、fabricjs canvas 事件、window 事件。
所以我们创建了简单的 EventBus class 像这样:
import EventEmitter from 'events'
class EventBus extends EventEmitter {}
const eb = new EventBus()
export default eb
然后我们可以像 import eventBus from '@/EventBus'
因此,通过使用此事件总线,我们的 class 不是 vue 组件的 es 可以对这些事件做出反应,并且这些事件也可以在 vue 组件中发出或捕获。
现在我们也想将 fabricjs 事件传输到我们的事件总线,这将消除 classes(和 vue 组件)直接引用 canvas 进行注册的需要参加活动。
所以假设我们将有一个 class,其中我们引用了 canvas,我们将像这样将事件传输到我们的事件总线:
this._canvas.on({
'mouse:down': e => eventBus.emit('canvas:mouse:down', e),
'mouse:up': e => eventBus.emit('canvas:mouse:up', e)
})
虽然这有效,但我注意到它在 mouse:moving
等事件上有一些性能开销,同时在 canvas 上处理许多对象,其中事件被称为快速。
我的问题是,我们应该那样做吗?或提供所有 classes 对 canvas 的访问权限,以便它们都可以直接注册到其事件总线并删除此 'unnecessary' 从一个事件总线到另一个事件总线的传输?
我的同事也想将 window 事件移动到我们的事件总线,但这对我来说似乎更加错误,因为我们拥有的所有东西都可以访问 window 对象。
在 fabricjs 的特殊情况下 canvas,这种操作应该不会那么昂贵。
鼠标移动时的 fabricjs 事件执行一些标准操作,这些操作与您拥有的对象数量有轻微关系。
这些操作是: 提取鼠标位置和一些加法、乘法以获得 canvas 相对坐标。遍历对象并查看对象是否与该坐标相交。将事件处理程序绑定到 canvas 实例并调用它。
您的事件转发应该是免费的。
说的对不对,要看项目。如果清晰的代码和组织的好处超过了额外的函数包装,那么它就有意义了。
例如,在任何地方导入您的 canvas 实例以使其可访问,会将您的事件处理程序绑定到那个特定的 canvas,您的代码将开始以困难的方式引用它你想在你的项目中添加另一个 canvas 你可能有麻烦了。