101 lines
2.5 KiB
Vue
101 lines
2.5 KiB
Vue
|
|
<template>
|
||
|
|
<a-menu class="czhj-menu" :mode="mode" :inlineIndent="inlineIndent" @click="clickMenu" @openChange="handleOpenChange" :openKeys="openKeys" :selectedKeys="urlToList($route.path)" v-bind="$attrs">
|
||
|
|
<sidebar-item v-for="route in sideMenuData" :menuItem="route" :key="route.path" :isLimitLevel="isLimitLevel" :base-path="basePath" :default-icon="defaultIcon"></sidebar-item>
|
||
|
|
</a-menu>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script lang="ts">
|
||
|
|
import { computed, defineComponent } from 'vue'
|
||
|
|
import SidebarItem from './SidebarItem.vue'
|
||
|
|
import { urlToList } from './utils'
|
||
|
|
import { useLink } from './useLink'
|
||
|
|
import useOpenKeys from './useOpenKeys'
|
||
|
|
|
||
|
|
export default defineComponent({
|
||
|
|
components: { SidebarItem },
|
||
|
|
props: {
|
||
|
|
mode: {
|
||
|
|
type: String,
|
||
|
|
default: 'vertical'
|
||
|
|
},
|
||
|
|
menuData: {
|
||
|
|
type: Array
|
||
|
|
},
|
||
|
|
isCollapsed: {
|
||
|
|
type: Boolean,
|
||
|
|
default: false
|
||
|
|
},
|
||
|
|
mainMenu: {
|
||
|
|
type: Boolean,
|
||
|
|
default: false
|
||
|
|
},
|
||
|
|
inlineIndent: {
|
||
|
|
type: Number,
|
||
|
|
default: 12
|
||
|
|
},
|
||
|
|
isLimitLevel: {
|
||
|
|
type: Boolean,
|
||
|
|
default: false
|
||
|
|
},
|
||
|
|
limitLevel: {
|
||
|
|
type: Number,
|
||
|
|
default: 4
|
||
|
|
},
|
||
|
|
basePath: {
|
||
|
|
type: String,
|
||
|
|
default: '/'
|
||
|
|
},
|
||
|
|
defaultIcon: {
|
||
|
|
type: String,
|
||
|
|
default: 'svg-dot'
|
||
|
|
}
|
||
|
|
},
|
||
|
|
setup(props, context) {
|
||
|
|
// 对菜单数据做过滤,去掉隐藏菜单
|
||
|
|
function filterMenuData(data: any) {
|
||
|
|
const menu: any[] = []
|
||
|
|
data.forEach((item: any) => {
|
||
|
|
if (!item.hidden) {
|
||
|
|
const cache = { ...item }
|
||
|
|
menu.push(cache)
|
||
|
|
if (item.children && item.path.split('/').length < props.limitLevel + 1) {
|
||
|
|
cache.children = filterMenuData(item.children)
|
||
|
|
} else {
|
||
|
|
cache.children = null
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
return menu.length ? menu : null
|
||
|
|
}
|
||
|
|
const sideMenuData = computed(() => filterMenuData(props.menuData))
|
||
|
|
// 菜单展示
|
||
|
|
const { openKeys, handleOpenChange } = useOpenKeys({
|
||
|
|
mainMenu: props.mainMenu
|
||
|
|
})
|
||
|
|
// 界面跳转
|
||
|
|
const goPage = useLink()
|
||
|
|
function clickMenu({ key }: { key: string }) {
|
||
|
|
goPage(key)
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
sideMenuData,
|
||
|
|
clickMenu,
|
||
|
|
urlToList,
|
||
|
|
openKeys,
|
||
|
|
handleOpenChange
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
</script>
|
||
|
|
<style lang="scss" scoped>
|
||
|
|
.czhj-menu {
|
||
|
|
background: var(--czhj-color-background);
|
||
|
|
color: var(--czhj-color-text);
|
||
|
|
border-right: none;
|
||
|
|
height: 100%;
|
||
|
|
::v-deep(.ant-menu-submenu-arrow) {
|
||
|
|
color: var(--czhj-color-text);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</style>
|