mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-04-26 19:46:42 +08:00
fix(editor): 右键菜单隐藏逻辑有问题
This commit is contained in:
parent
6eb1f2418a
commit
c99663a3e8
@ -11,13 +11,19 @@
|
|||||||
></tool-button>
|
></tool-button>
|
||||||
</div>
|
</div>
|
||||||
<teleport to="body">
|
<teleport to="body">
|
||||||
<content-menu class="sub-menu" ref="subMenu" :menu-data="subMenuData"></content-menu>
|
<content-menu
|
||||||
|
class="sub-menu"
|
||||||
|
ref="subMenu"
|
||||||
|
:menu-data="subMenuData"
|
||||||
|
:is-sub-menu="true"
|
||||||
|
@hide="hide"
|
||||||
|
></content-menu>
|
||||||
</teleport>
|
</teleport>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, nextTick, onMounted, PropType, ref } from 'vue';
|
import { defineComponent, nextTick, onMounted, onUnmounted, PropType, ref } from 'vue';
|
||||||
|
|
||||||
import { MenuButton, MenuItem } from '@editor/type';
|
import { MenuButton, MenuItem } from '@editor/type';
|
||||||
|
|
||||||
@ -31,9 +37,16 @@ export default defineComponent({
|
|||||||
type: Array as PropType<MenuItem[]>,
|
type: Array as PropType<MenuItem[]>,
|
||||||
default: () => [],
|
default: () => [],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
isSubMenu: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
setup() {
|
emits: ['hide', 'show'],
|
||||||
|
|
||||||
|
setup(props, { emit }) {
|
||||||
const menu = ref<HTMLDivElement>();
|
const menu = ref<HTMLDivElement>();
|
||||||
const subMenu = ref<any>();
|
const subMenu = ref<any>();
|
||||||
const visible = ref(false);
|
const visible = ref(false);
|
||||||
@ -44,20 +57,35 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const hide = () => {
|
const hide = () => {
|
||||||
|
if (!visible.value) return;
|
||||||
|
|
||||||
visible.value = false;
|
visible.value = false;
|
||||||
|
subMenu.value?.hide();
|
||||||
|
|
||||||
|
emit('hide');
|
||||||
};
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
const hideHandler = (e: MouseEvent) => {
|
||||||
globalThis.addEventListener(
|
const target = e.target as HTMLElement | undefined;
|
||||||
'mouseup',
|
if (!visible.value || !target) {
|
||||||
(e: MouseEvent) => {
|
return;
|
||||||
if (!visible.value || (e.target && menu.value?.contains(e.target as HTMLElement))) {
|
}
|
||||||
|
if (menu.value?.contains(target) || subMenu.value?.$el?.contains(target)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
hide();
|
hide();
|
||||||
},
|
};
|
||||||
true,
|
|
||||||
);
|
onMounted(() => {
|
||||||
|
if (props.isSubMenu) return;
|
||||||
|
|
||||||
|
globalThis.addEventListener('mousedown', hideHandler, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
if (props.isSubMenu) return;
|
||||||
|
|
||||||
|
globalThis.removeEventListener('mousedown', hideHandler, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@ -70,6 +98,8 @@ export default defineComponent({
|
|||||||
hide,
|
hide,
|
||||||
|
|
||||||
show(e: MouseEvent) {
|
show(e: MouseEvent) {
|
||||||
|
// 加settimeout是以为,如果菜单中的按钮监听的是mouseup,那么菜单显示出来时鼠标如果正好在菜单上就会马上触发按钮的mouseup
|
||||||
|
setTimeout(() => {
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
@ -82,9 +112,12 @@ export default defineComponent({
|
|||||||
|
|
||||||
menuStyle.value = {
|
menuStyle.value = {
|
||||||
top: `${top}px`,
|
top: `${top}px`,
|
||||||
left: `${e.clientX + 2}px`,
|
left: `${e.clientX}px`,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
emit('show');
|
||||||
});
|
});
|
||||||
|
}, 300);
|
||||||
},
|
},
|
||||||
|
|
||||||
showSubMenu(item: MenuItem) {
|
showSubMenu(item: MenuItem) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user