From 334569e2d784d708f4fde7e9f37f5cac50b2e396 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Tue, 7 Apr 2026 19:19:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(editor):=20=E6=B7=BB=E5=8A=A0=20stage=20be?= =?UTF-8?q?foreDblclick=20=E9=92=A9=E5=AD=90=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E9=BB=98=E8=AE=A4=E5=8F=8C=E5=87=BB=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 StageOptions 和 EditorProps 中新增 beforeDblclick 配置项, 该函数返回 false 或 Promise 时将阻止 stage 默认的双击处理逻辑。 Made-with: Cursor --- packages/editor/src/Editor.vue | 1 + packages/editor/src/editorProps.ts | 2 ++ packages/editor/src/layouts/workspace/viewer/Stage.vue | 6 ++++++ packages/editor/src/type.ts | 2 ++ 4 files changed, 11 insertions(+) diff --git a/packages/editor/src/Editor.vue b/packages/editor/src/Editor.vue index 78aefff6..dedbc66f 100644 --- a/packages/editor/src/Editor.vue +++ b/packages/editor/src/Editor.vue @@ -207,6 +207,7 @@ const stageOptions: StageOptions = { renderType: props.renderType, guidesOptions: props.guidesOptions, disabledMultiSelect: props.disabledMultiSelect, + beforeDblclick: props.beforeDblclick, }; stageOverlayService.set('stageOptions', stageOptions); diff --git a/packages/editor/src/editorProps.ts b/packages/editor/src/editorProps.ts index 7d1e283e..7d2a21c1 100644 --- a/packages/editor/src/editorProps.ts +++ b/packages/editor/src/editorProps.ts @@ -98,6 +98,8 @@ export interface EditorProps { isContainer?: (el: HTMLElement) => boolean | Promise; /** 用于自定义组件树与画布的右键菜单 */ customContentMenu?: CustomContentMenuFunction; + /** 画布双击前的钩子函数,返回 false 则阻止默认的双击行为 */ + beforeDblclick?: (event: MouseEvent) => Promise | boolean | void; extendFormState?: (state: FormState) => Record | Promise>; /** 页面顺序拖拽配置参数 */ pageBarSortOptions?: PageBarSortOptions; diff --git a/packages/editor/src/layouts/workspace/viewer/Stage.vue b/packages/editor/src/layouts/workspace/viewer/Stage.vue index 483643d0..d445cb21 100644 --- a/packages/editor/src/layouts/workspace/viewer/Stage.vue +++ b/packages/editor/src/layouts/workspace/viewer/Stage.vue @@ -164,10 +164,16 @@ watchEffect(() => { }); stage.on('dblclick', async (event: MouseEvent) => { + if (props.stageOptions.beforeDblclick) { + const result = await props.stageOptions.beforeDblclick(event); + if (result === false) return; + } + const el = (await stage?.actionManager?.getElementFromPoint(event)) || null; if (!el) return; const id = getIdFromEl()(el); + if (id) { const node = editorService.getNodeById(id); if (node?.type === 'page-fragment-container' && node.pageFragmentId) { diff --git a/packages/editor/src/type.ts b/packages/editor/src/type.ts index 092ff9a2..c2f9e11f 100644 --- a/packages/editor/src/type.ts +++ b/packages/editor/src/type.ts @@ -164,6 +164,8 @@ export interface StageOptions { disabledMultiSelect?: boolean; disabledRule?: boolean; zoom?: number; + /** 画布双击前的钩子函数,返回 false 则阻止默认的双击行为 */ + beforeDblclick?: (event: MouseEvent) => Promise | boolean | void; } export interface StoreState {