GlobalMenu.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <script setup lang="ts">
  2. import { useRouterStore } from '@/stores/router'
  3. import { useMenuStore } from '@/stores/menu'
  4. const menuStore = useMenuStore()
  5. // 生成菜单部分开始
  6. const routerStore = useRouterStore()
  7. const menuRouter = routerStore.menuRouter
  8. const generatorMenu = (routes: any[]) => {
  9. routes.forEach(route => {
  10. if (route.children && route.children.length) {
  11. route.menuName = 'el-sub-menu'
  12. generatorMenu(route.children)
  13. } else {
  14. route.menuName = 'el-menu-item'
  15. }
  16. })
  17. }
  18. generatorMenu(menuRouter)
  19. // 生成菜单部分结束
  20. const router = useRouter()
  21. const route = useRoute()
  22. const isAbsolutePath = (path: string) => {
  23. return path.startsWith('http')
  24. }
  25. const handleSelect = (index: string) => {
  26. if (isAbsolutePath(index)) {
  27. window.open(index)
  28. } else {
  29. router.push(index)
  30. }
  31. }
  32. </script>
  33. <template>
  34. <el-menu
  35. :default-active="route.path"
  36. :collapse="menuStore.collapse"
  37. :collapse-transition="false"
  38. class="layout-menu"
  39. :class="{ 'menu-normal': !menuStore.collapse }"
  40. @select="handleSelect"
  41. >
  42. <component :is="item.menuName" :index="item.path" v-for="(item, index) in menuRouter" :key="index">
  43. <el-icon v-if="item.menuName === 'el-menu-item'"><component :is="item.meta?.icon"></component></el-icon>
  44. <template #title>
  45. <el-icon v-if="item.menuName === 'el-sub-menu'"><component :is="item.meta?.icon"></component></el-icon>
  46. <span>{{ item.meta.title }}</span>
  47. </template>
  48. <el-menu-item
  49. :index="isAbsolutePath(subItem.path) ? subItem.path : item.path + '/' + subItem.path"
  50. v-for="(subItem, key) in item.children"
  51. :key="key"
  52. >
  53. <template #title>
  54. <el-icon v-if="subItem.meta?.icon"><component :is="subItem.meta?.icon"></component></el-icon>
  55. <span>{{ subItem.meta.title }}</span>
  56. </template>
  57. </el-menu-item>
  58. </component>
  59. </el-menu>
  60. </template>
  61. <style scoped>
  62. .menu-normal {
  63. width: var(--menu-width);
  64. }
  65. .layout-menu {
  66. background-color: #fff;
  67. height: 100%;
  68. border: none;
  69. flex-shrink: 0;
  70. }
  71. .layout-menu .el-menu-item.is-active {
  72. background-color: var(--el-color-primary);
  73. color: #fff;
  74. }
  75. </style>