Industrial-image-management.../src/layout/components/Menu/MenuItem.vue

94 lines
2.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<template v-if="!item.meta?.hidden">
<a-menu-item
v-if="
isOneShowingChild
&& (!onlyOneChild?.children || onlyOneChild?.meta?.noShowingChildren)
&& !item?.meta?.alwaysShow
"
v-bind="attrs"
:key="onlyOneChild?.path"
>
<template #icon>
<MenuIcon
:svg-icon="onlyOneChild?.meta?.svgIcon || item?.meta?.svgIcon"
:icon="onlyOneChild?.meta?.icon || item?.meta?.icon"
/>
</template>
<a-tooltip :content="onlyOneChild?.meta?.title" position="right">
<span class="menu-item-text">{{ onlyOneChild?.meta?.title }}</span>
</a-tooltip>
</a-menu-item>
<a-sub-menu v-else v-bind="attrs" :key="item.path" :title="item?.meta?.title">
<template #icon>
<MenuIcon :icon="item?.meta?.icon" />
</template>
<MenuItem v-for="child in item.children" :key="child.path" :item="child"></MenuItem>
</a-sub-menu>
</template>
</template>
<script setup lang="ts">
import type { RouteRecordRaw } from 'vue-router'
import MenuIcon from './MenuIcon.vue'
defineOptions({ name: 'MenuItem' })
const props = withDefaults(defineProps<Props>(), {})
const attrs = useAttrs()
interface Props {
item: RouteRecordRaw
}
// 如果hidden: false那么代表这个路由项显示在左侧菜单栏中
// 如果props.item的子项children只有一个hidden: false的子元素, 那么onlyOneChild就表示这个子元素
const onlyOneChild = ref<RouteRecordRaw | null>(null)
const isOneShowingChild = ref(false)
// 使用watchEffect来响应props变化避免在setup阶段直接调用
watchEffect(() => {
const children = props.item?.children?.length ? props.item.children : []
// 判断是否只有一个显示的子项
const showingChildren = children.filter((i) => i.meta?.hidden === false)
if (showingChildren.length) {
// 保存子项最后一个hidden: false的元素
onlyOneChild.value = showingChildren[showingChildren.length - 1]
} else {
onlyOneChild.value = null
}
// 当只有一个要显示子路由时, 默认显示该子路由器
if (showingChildren.length === 1) {
isOneShowingChild.value = true
}
// 如果没有要显示的子路由, 则显示父路由
else if (showingChildren.length === 0) {
onlyOneChild.value = { ...props.item, meta: { ...props.item.meta, noShowingChildren: true } } as any
isOneShowingChild.value = true
} else {
isOneShowingChild.value = false
}
})
</script>
<style scoped>
.menu-item-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
}
:deep(.arco-menu-title) {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
}
</style>