58 多页签右键菜单功能开发 - udo-bit/naive_admin_pro GitHub Wiki
上节课我们已经完成了菜单功能的开发,这节课我们就来实现一下在tab上的右击菜单的功能。
首先我们需要在tab-item.vue中添加一个右键事件。然后抛出去给我们的父级。
<script lang="ts" setup>
defineProps<{
item: TabItem
onContextmenu: (e: MouseEvent) => void
}>()
</script>
<template>
<span @contextmenu="onContextmenu">
{{ $t(item.tabTitle) }}
</span>
</template>
然后我们在父级进行处理右键菜单事件的处理。
首先我先来解释一下为什么要在父级去处理这个问题,我们打开naviui的官网,找到dropdown的功能,然后我们看一下右键部分的代码实现。
大家可以看到这一部分是独立处理的,也就是说我们全局只需要一个dropdown就可以了,所以我们就不需要在这个循环组件里面去处理右键事件了。这也就是为什么我们将右键事件抛给父级的原因了。
接下来我们在multi-tab的index.vue中实现右键:
<script lang="ts" setup>
const menuDropdown = reactive({
x: 0,
y: 0,
show: false,
})
function handleClose(path: string) {
closeTab(path)
menuDropdown.show = false
}
const handleContextMenu = (e: MouseEvent) => {
e.preventDefault()
menuDropdown.show = false
nextTick(() => {
menuDropdown.x = e.clientX
menuDropdown.y = e.clientY
menuDropdown.show = true
})
}
function renderTab(item: TabItem) {
return h(TabItemComp, { item, onContextmenu: handleContextMenu })
}
const handleMenuChange = (key: string) => {
if (key === 'closeCurrent')
closeTab()
else if (key === 'refreshCurrent')
refresh()
menuDropdown.show = false
}
</script>
<template>
<n-dropdown
:options="dropdownOptions"
trigger="manual"
:x="menuDropdown.x"
:y="menuDropdown.y"
:show="menuDropdown.show"
placement="bottom-start"
@select="handleMenuChange"
@clickoutside="menuDropdown.show = false"
/>
</template>
然后我们进行测试。