submenu.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <template>
  2. <template v-for="(item, index) in dataList" :key="index">
  3. <el-sub-menu :index="item.code" :show-timeout="100" :hide-timeout="100" v-if="item.children?.length">
  4. <template #title>
  5. <!--如果没有图标,用标题第一个字代替-->
  6. <template v-if="item.icon">
  7. <app-icon class="menu-icon" :icon="item.icon" />
  8. <span>{{ item.title }}</span>
  9. </template>
  10. <template v-else>
  11. <i class="menu-icon menu-icon--text">{{ item.title.slice(0, 1) }}</i>
  12. <span>{{ item.title.slice(1) }}</span>
  13. </template>
  14. </template>
  15. <!--如果存在子级,递归组件自身-->
  16. <app-submenu :data-list="item.children" />
  17. </el-sub-menu>
  18. <el-menu-item :index="item.code" @click="onMenuClick" v-else>
  19. <app-icon class="menu-icon" :icon="item.icon" v-if="item.icon" />
  20. <span>{{ item.title }}</span>
  21. </el-menu-item>
  22. </template>
  23. </template>
  24. <script lang="ts">
  25. import { defineComponent, PropType } from 'vue'
  26. import type { MenuItemRegistered } from 'element-plus'
  27. import AppIcon from '@pc/components/base/icon/index.vue'
  28. export default defineComponent({
  29. name: 'AppSubmenu',
  30. components: {
  31. AppIcon
  32. },
  33. emits: ['click'],
  34. props: {
  35. dataList: {
  36. type: Array as PropType<Ermcp.UserRoutes[]>,
  37. required: true,
  38. },
  39. },
  40. setup(props, { emit }) {
  41. // 点击菜单
  42. const onMenuClick = (item: MenuItemRegistered) => {
  43. emit('click', item.index)
  44. }
  45. return {
  46. onMenuClick
  47. }
  48. }
  49. })
  50. </script>