对el-menu组件进行递归封装(根据路由配置动态生成)
2023-12-13 20:14:22
父组件调用子组件Menu
<el-menu :default-active="$route.path"
active-text-color="#fff"
background-color="#001529"
text-color="#959ea6"
:router="true"
:collapse="layoutStore.fold">
<Menus :routes="routes"></Menus>
</el-menu>
下面是routes的值(这个是v-router的配置)
const routes = [
{
path: '/login',
component: () => import('@/views/login/index.vue'),
name: 'login',
meta: {
title: '登录',
hidden: true,
},
},
{
path: '/',
component: () => import('@/views/layout/index.vue'),
name: 'layout',
meta: {
title: '',
hidden: false,
icon: '',
},
redirect: '/home',
children: [
{
path: '/home',
component: () => import('@/views/home/index.vue'),
name: 'home',
meta: {
title: '首页',
hidden: false,
icon: 'HomeFilled',
},
},
],
},
{
path: '/screen',
component: () => import('@/views/screen/index.vue'),
name: 'Screen',
meta: {
title: '数据大屏',
hidden: false,
icon: 'DataBoard',
},
},
{
path: '/acl',
component: () => import('@/views/layout/index.vue'),
name: 'Acl',
meta: {
title: '权限管理',
hidden: false,
icon: 'Lock',
},
redirect: '/acl/user',
children: [
{
path: '/acl/user',
component: () => import('@/views/acl/user/index.vue'),
name: 'User',
meta: {
title: '用户管理',
hidden: false,
icon: 'User',
},
},
{
path: '/acl/role',
component: () => import('@/views/acl/role/index.vue'),
name: 'Role',
meta: {
title: '角色管理',
hidden: false,
icon: 'Avatar',
},
},
{
path: '/acl/permission',
component: () => import('@/views/acl/permission/index.vue'),
name: 'Permission',
meta: {
title: '菜单管理',
hidden: false,
icon: 'List',
},
},
],
},
{
path: '/product',
component: () => import('@/views/layout/index.vue'),
name: 'Product',
meta: {
title: '商品管理',
hidden: false,
icon: 'Goods',
},
redirect: '/product/trademark',
children: [
{
path: '/product/trademark',
component: () => import('@/views/product/trademark/index.vue'),
name: 'Trademark',
meta: {
title: '品牌管理',
icon: 'ShoppingCart',
hidden: false,
},
},
{
path: '/product/attr',
component: () => import('@/views/product/attr/index.vue'),
name: 'Attr',
meta: {
title: '属性管理',
icon: 'Management',
hidden: false,
},
},
{
path: '/product/spu',
component: () => import('@/views/product/spu/index.vue'),
name: 'Spu',
meta: {
title: 'Spu',
icon: 'SetUp',
hidden: false,
},
},
{
path: '/product/sku',
component: () => import('@/views/product/sku/index.vue'),
name: 'Sku',
meta: {
title: 'Sku',
icon: 'ScaleToOriginal',
hidden: false,
},
},
],
}
]
子组件
<template>
<template v-for="item in routes" :key="item.name">
<!-- 没有子路由 -->
<template v-if="!item.children || item.children.length === 0">
<el-menu-item v-if="!item.meta.hidden" :index="item.path">
<el-icon>
<component :is="item.meta.icon" />
</el-icon>
<template #title>
<span>{{ item.meta.title }}</span>
</template>
</el-menu-item>
</template>
<!-- 只有一个子路由 并且只显示子路由的信息 -->
<template v-if="item.children && item.children.length === 1">
<el-menu-item v-if="!item.children[0].meta.hidden" :index="item.children[0].path">
<el-icon>
<component :is="item.children[0].meta.icon" />
</el-icon>
<template #title>
<span>{{ item.children[0].meta.title }}</span>
</template>
</el-menu-item>
</template>
<!-- 有多个子路由 -->
<template v-if="item.children && item.children.length > 1">
<el-sub-menu :index="item.path">
<template #title>
<el-icon>
<component :is="item.meta.icon" />
</el-icon>
<span>{{ item.meta.title }}</span>
</template>
<Menus :routes="item.children" />
</el-sub-menu>
</template>
</template>
</template>
<script setup lang="ts">
defineProps(['routes'])
</script>
<script lang="ts">
export default {
name: 'Menus',
}
</script>
<style lang="scss" scoped></style>
文章来源:https://blog.csdn.net/xinbaiyu/article/details/134896958
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!