SubMenu.vue 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <template>
  2. <template v-for="subItem in menuList" :key="subItem.path">
  3. <el-sub-menu v-if="subItem.children?.length" teleported popper-class="layout-menu-popper-wrap" :index="subItem.path">
  4. <template #title>
  5. <PickerIcon v-if="subItem.meta.icon" :icon-class="subItem.meta.icon" />
  6. <!-- <el-icon v-if="subItem.meta.icon">
  7. <component :is="subItem.meta.icon" />
  8. </el-icon>-->
  9. <span class="sle">{{ generateTitle(subItem.meta?.title) }}</span>
  10. </template>
  11. <SubMenu :menu-list="subItem.children" />
  12. </el-sub-menu>
  13. <el-menu-item v-else popper-class="layout-menu-popper-wrap" :index="subItem.path" @click="handleClickMenu(subItem)">
  14. <PickerIcon v-if="subItem.meta.icon" :icon-class="subItem.meta.icon" />
  15. <!-- <el-icon>
  16. <component :is="subItem.meta.icon"></component>
  17. </el-icon>-->
  18. <template #title>
  19. <span class="sle">{{ generateTitle(subItem.meta?.title) }}</span>
  20. </template>
  21. </el-menu-item>
  22. </template>
  23. </template>
  24. <script setup lang="ts">
  25. import { useRouter } from 'vue-router'
  26. import { generateTitle } from '@/utils/i18n'
  27. import PickerIcon from '@/components/IconPicker/PickerIcon.vue'
  28. import { isExternal } from '@/utils/validate'
  29. import { ElMessage } from 'element-plus'
  30. defineProps<{ menuList: RouteMenu.Item[] }>()
  31. const router = useRouter()
  32. /**
  33. * 1、在此判断是否是外链 subItem.meta.type === 'iframe'
  34. * 是外链,则直接跳转(先不考虑在框架中打开外链)
  35. * 否则跳转路由
  36. * @param subItem
  37. */
  38. const handleClickMenu = (subItem: RouteMenu.Item) => {
  39. const { type } = subItem.meta
  40. const isIframe = ['iframe', 'link'].includes(type) // true 外链 false 系统路由
  41. if (!isIframe) {
  42. router.push(subItem.path)
  43. } else {
  44. if (!isExternal(subItem.props.url)) return ElMessage.error(`当前Url不是外链地址,请检查重定向配置~`)
  45. if (type === 'link') {
  46. return window.open(subItem.redirect, '_blank')
  47. } else {
  48. router.push({ path: `${subItem.path}` })
  49. }
  50. }
  51. }
  52. </script>
  53. <style lang="scss">
  54. .el-menu--collapse {
  55. .el-sub-menu__title {
  56. display: flex;
  57. align-items: center;
  58. justify-content: center;
  59. padding: 0;
  60. }
  61. .is-active {
  62. .el-sub-menu__title {
  63. &::before {
  64. background-color: var(--el-color-primary) !important;
  65. }
  66. }
  67. }
  68. }
  69. .el-menu-item {
  70. /*&:hover {
  71. color: var(--el-menu-hover-text-color);
  72. }*/
  73. &.is-active {
  74. color: var(--el-menu-active-color) !important;
  75. }
  76. }
  77. </style>