65 lines
1.3 KiB
Vue
65 lines
1.3 KiB
Vue
<template>
|
|
<a-menu mode="vertical" :style="{ width }" class="multi-level-menu">
|
|
<template v-for="(item, index) in children">
|
|
<a-menu-item :key="index" v-bind="item.attrs" @click="handleMenuClick(item)">
|
|
{{ item.title }}
|
|
<div v-if="item.children" :key="index">
|
|
<a-menu class="multi-level-menu-sub-menu">
|
|
<a-menu-item v-for="child in item.children" :key="child.key" @click="handleSubMenuClick(item, child)">
|
|
{{ child.title }}
|
|
</a-menu-item>
|
|
</a-menu>
|
|
</div>
|
|
</a-menu-item>
|
|
</template>
|
|
</a-menu>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
children: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
width: {
|
|
type: String,
|
|
default: 'auto'
|
|
}
|
|
},
|
|
methods: {
|
|
handleMenuClick(item) {
|
|
if (!item.children) {
|
|
this.$emit('menuClick', item)
|
|
}
|
|
},
|
|
handleSubMenuClick(item, child) {
|
|
this.$emit('submenuClick', { item, child })
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="less">
|
|
.multi-level-menu {
|
|
.ant-menu-item {
|
|
overflow: visible;
|
|
|
|
.multi-level-menu-sub-menu {
|
|
position: absolute;
|
|
top: 0;
|
|
right: 0;
|
|
transform: translateX(100%);
|
|
display: none;
|
|
background: #03353f;
|
|
}
|
|
|
|
&-active {
|
|
.multi-level-menu-sub-menu {
|
|
display: block;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|