Skip to content

事件系统

EditorHost 内置类型安全的事件总线,插件和用户代码都可以发布/订阅事件。

事件监听与移除

typescript
import type { ElementEventData } from 'vkedit'

// 监听事件(使用具名函数)
const onElementAdded = (data: ElementEventData) => {
  console.log('元素已添加:', data.element.id)
}
host.on('element:added', onElementAdded)

// 移除特定监听(传入同一函数引用)
host.off('element:added', onElementAdded)

移除监听

在组件卸载时务必移除事件监听,否则会导致内存泄漏。使用具名函数而非匿名函数,以便精确移除。

事件回调参数

所有事件回调接收一个 payload 对象。例如 element:added 的 payload 包含 element(元素实例)、elementIdtimestampsource 等字段。

内置事件列表

元素事件

事件名Payload 关键字段触发时机
element:addedelement, elementId元素被添加到画布
element:removedelement, elementId元素被删除
element:transformedelement, oldState, newState, transformType元素位置/大小/旋转变化
element:updatedelement, updatedProperties元素属性更新
element:copiedelement, elementId元素被复制
element:pastedelement, elementId元素被粘贴
element:clonedelement, elementId元素被克隆

选择事件

事件名Payload 关键字段触发时机
selection:changedselectionIGraphicElement[]选中元素集合变化(包括清空选择时触发,payload 中 selection 为空数组)

舞台事件

事件名Payload 关键字段触发时机
stage:mousedownpoint, target, evt画布鼠标按下
stage:mousemovepoint, target, evt画布鼠标移动
stage:mouseuppoint, target, evt画布鼠标释放
stage:clickpoint, target, evt画布点击
stage:dblclickpoint, element, elementId画布双击
stage:keydownevt键盘按下

命令历史事件

事件名Payload 关键字段触发时机
command:executedcommand命令执行
command:undonecommand命令撤销
command:redonecommand命令重做

状态事件

事件名Payload 关键字段触发时机
host:status-changedstatus画布状态变化(尺寸、DPM、缩放等)
plugin:registeredplugin插件注册
plugin:unregisteredplugin插件注销

视图事件

事件名Payload 关键字段触发时机
view:snap-changezoom吸附开关切换

缩放变化监听

view:zoom-change 事件目前在类型中定义但尚未实际触发。如需监听缩放变化,请监听 host:status-changed 事件并检查 status.zoom 是否变化。

在 Vue 中使用

vue
<script setup lang="ts">
import { createEditorHost, type SelectionEventData } from 'vkedit'
import { ref, onMounted, onUnmounted } from 'vue'

const host = createEditorHost()
const selectedCount = ref(0)

const onSelectionChanged = (data: SelectionEventData) => {
  selectedCount.value = data.selection.length
}

onMounted(() => {
  host.on('selection:changed', onSelectionChanged)
})

onUnmounted(() => {
  host.off('selection:changed', onSelectionChanged)
})
</script>

下一步

基于 MIT 许可发布