fix(editor): 右键菜单隐藏逻辑有问题

This commit is contained in:
roymondchen 2022-06-03 22:11:54 +08:00 committed by jia000
parent 6eb1f2418a
commit c99663a3e8

View File

@ -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) {
// settimeoutmouseupmouseup
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) {