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 {