SubMenu.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <template>
  2. <template v-for="subItem in menuList" :key="subItem.path">
  3. <el-sub-menu v-if="subItem.children?.length" :index="subItem.path">
  4. <template #title>
  5. <svg-icon v-if="subItem.meta.icon" :name="subItem.meta.icon" class="menu-svg-icon" />
  6. <span class="sle" :title="subItem.meta.title">{{ subItem.meta.title }}</span>
  7. </template>
  8. <SubMenu :menu-list="subItem.children" />
  9. </el-sub-menu>
  10. <el-menu-item v-else :index="subItem.path" @click="handleClickMenu(subItem)">
  11. <svg-icon v-if="subItem.meta.icon" :name="subItem.meta.icon" class="menu-svg-icon" />
  12. <template #title>
  13. <span class="sle" :title="subItem.meta.title">{{ subItem.meta.title }}</span>
  14. </template>
  15. </el-menu-item>
  16. </template>
  17. </template>
  18. <script setup lang="ts">
  19. defineProps<{ menuList: Menu.MenuOptions[] }>()
  20. const router = useRouter()
  21. const handleClickMenu = (subItem: Menu.MenuOptions) => {
  22. if (subItem.meta.link) return window.open(subItem.meta.link, '_blank')
  23. router.push(subItem.path)
  24. }
  25. </script>
  26. <style lang="scss">
  27. .menu-svg-icon {
  28. width: 24px;
  29. }
  30. .el-sub-menu .el-sub-menu__title:hover {
  31. color: var(--el-menu-hover-text-color) !important;
  32. background-color: var(--el-menu-active-bg-color) !important;
  33. }
  34. .el-sub-menu.is-active > .el-sub-menu__title {
  35. color: var(--el-menu-active-color) !important;
  36. background-color: var(--el-menu-bg-color) !important;
  37. }
  38. .el-menu--collapse {
  39. .is-active {
  40. .el-sub-menu__title {
  41. color: #ffffff !important;
  42. background-color: var(--el-color-primary) !important;
  43. }
  44. }
  45. }
  46. .el-menu-item {
  47. &:hover {
  48. color: var(--el-menu-hover-text-color) !important;
  49. background-color: var(--el-menu-active-bg-color) !important;
  50. }
  51. &.is-active {
  52. color: var(--el-menu-active-color) !important;
  53. background-color: var(--el-menu-active-bg-color) !important;
  54. &::before {
  55. position: absolute;
  56. top: 0;
  57. bottom: 0;
  58. width: 6px;
  59. content: '';
  60. background-color: var(--el-color-primary);
  61. border-radius: 6px;
  62. }
  63. }
  64. }
  65. .vertical,
  66. .classic,
  67. .transverse {
  68. .el-menu-item {
  69. &.is-active {
  70. &::before {
  71. left: 0;
  72. }
  73. }
  74. }
  75. }
  76. .columns {
  77. .el-menu-item {
  78. &.is-active {
  79. &::before {
  80. right: 0;
  81. }
  82. }
  83. }
  84. }
  85. </style>