sub-menu.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <script setup lang="ts">
  2. import type { MenuRecordRaw } from '@vben-core/typings';
  3. import { computed } from 'vue';
  4. import { VbenMenuBadge } from '@vben-core/shadcn-ui';
  5. import { MenuItem, SubMenu as SubMenuComp } from './components';
  6. // eslint-disable-next-line import/no-self-import
  7. import SubMenu from './sub-menu.vue';
  8. interface Props {
  9. /**
  10. * 菜单项
  11. */
  12. menu: MenuRecordRaw;
  13. }
  14. defineOptions({
  15. name: 'SubMenuUi',
  16. });
  17. const props = withDefaults(defineProps<Props>(), {});
  18. /**
  19. * 判断是否有子节点,动态渲染 menu-item/sub-menu-item
  20. */
  21. const hasChildren = computed(() => {
  22. const { menu } = props;
  23. return (
  24. Reflect.has(menu, 'children') && !!menu.children && menu.children.length > 0
  25. );
  26. });
  27. </script>
  28. <template>
  29. <MenuItem
  30. v-if="!hasChildren"
  31. :key="menu.path"
  32. :badge="menu.badge"
  33. :badge-type="menu.badgeType"
  34. :badge-variants="menu.badgeVariants"
  35. :icon="menu.icon"
  36. :path="menu.path"
  37. >
  38. <template #title>{{ menu.name }}</template>
  39. </MenuItem>
  40. <SubMenuComp
  41. v-else
  42. :key="`${menu.path}_sub`"
  43. :icon="menu.icon"
  44. :path="menu.path"
  45. >
  46. <template #content>
  47. <VbenMenuBadge
  48. :badge="menu.badge"
  49. :badge-type="menu.badgeType"
  50. :badge-variants="menu.badgeVariants"
  51. />
  52. </template>
  53. <template #title>{{ menu.name }}</template>
  54. <template v-for="childItem in menu.children || []" :key="childItem.path">
  55. <SubMenu :menu="childItem" />
  56. </template>
  57. </SubMenuComp>
  58. </template>