引领前端布局新风尚:Vue 3 自定义侧边栏菜单组件 - vue-sidebar-menu
<template>
<div class="sidebar-menu">
<ul>
<li v-for="(menuItem, index) in menuItems" :key="index">
<sidebar-menu-item
:menu-item="menuItem"
:depth="0"
:expanded="isExpanded(menuItem)"
@toggle="handleToggle(menuItem)"
/>
<ul v-if="menuItem.children" :class="{'sub-menu': true, 'expanded': isExpanded(menuItem)}">
<li v-for="(child, childIndex) in menuItem.children" :key="childIndex">
<sidebar-menu-item
:menu-item="child"
:depth="1"
:expanded="isExpanded(child)"
@toggle="handleToggle(child)"
/>
</li>
</ul>
</li>
</ul>
</div>
</template>
<script>
import SidebarMenuItem from './SidebarMenuItem.vue';
export default {
name: 'SidebarMenu',
components: {
SidebarMenuItem
},
props: {
menuItems: {
type: Array,
default: () => []
}
},
data() {
return {
expandedItems: []
};
},
methods: {
handleToggle(menuItem) {
const index = this.expandedItems.indexOf(menuItem);
if (index === -1) {
this.expandedItems.push(menuItem);
} else {
this.expandedItems.splice(index, 1);
}
this.$emit('toggle', menuItem);
},
isExpanded(menuItem) {
return this.expandedItems.includes(menuItem);
}
}
};
</script>
<style scoped>
.sidebar-menu ul {
list-style-type: none;
padding: 0;
margin: 0;
}
.sidebar-menu .sub-menu {
display: none;
}
.sidebar-menu .expanded {
display: block;
}
</style>
这个代码实例展示了如何使用Vue 3创建一个可以管理多级菜单的侧边栏组件。它使用了递归组件SidebarMenuItem
来处理每一个菜单项,并通过一个数组expandedItems
来跟踪哪些菜单项应该是展开的。这个实例简洁明了,并且使用了单文件组件的格式,使得整个菜单组件的定义更加清晰。
评论已关闭