left-menu.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <template>
  2. <div class="left-menu">
  3. <t-menu
  4. :key="key"
  5. theme="dark"
  6. v-model:expanded="openKeys"
  7. v-model:value="activeKey"
  8. :collapsed="appStore.menuCollapse"
  9. :width="
  10. (appStore.menuCollapse ? appStore.collapseWidth : appStore.menuWidth) +
  11. 'px'
  12. "
  13. >
  14. <template #logo>
  15. <div class="logo-box flex justify-center items-center">
  16. <img src="../assets/logo.svg" />
  17. </div>
  18. </template>
  19. <children-menu v-model="userStore.moduleMenus" />
  20. <template #operations>
  21. <div
  22. class="flex justify-center items-center cursor-pointer h-full"
  23. @click="onCollapse"
  24. >
  25. <t-icon
  26. v-if="appStore.menuCollapse"
  27. name="chevron-right-double"
  28. color="#fff"
  29. />
  30. <t-icon v-else name="chevron-left-double" color="#fff" />
  31. </div>
  32. </template>
  33. </t-menu>
  34. </div>
  35. </template>
  36. <script setup name="LeftMenu">
  37. import { ref, watch, onBeforeMount } from 'vue';
  38. import { useRoute, useRouter, onBeforeRouteUpdate } from 'vue-router';
  39. import { useAppStore, useUserStore } from '@/store';
  40. import childrenMenu from './children-menu.vue';
  41. import { moduleMap } from '@/router/asyncRoutes';
  42. const route = useRoute();
  43. const router = useRouter();
  44. // const menus = ref([]);
  45. const activeKey = ref('');
  46. const openKeys = ref([]);
  47. const appStore = useAppStore();
  48. const userStore = useUserStore();
  49. const key = ref(new Date().getTime() + '');
  50. onBeforeMount(() => {
  51. activeKey.value = route.name;
  52. setOpenMenu();
  53. });
  54. onBeforeRouteUpdate((to) => {
  55. activeKey.value = to.name;
  56. let firstPath = to.path.split('/')[1];
  57. let curModuleName = moduleMap[firstPath];
  58. userStore.setCurPageModule(curModuleName);
  59. });
  60. watch(
  61. () => userStore.moduleMenus,
  62. () => {
  63. setOpenMenu();
  64. setTimeout(() => {
  65. key.value = new Date().getTime() + '';
  66. }, 0);
  67. }
  68. );
  69. const onCollapse = () => {
  70. appStore.toggleMenu();
  71. };
  72. const setOpenMenu = () => {
  73. openKeys.value = [];
  74. //如果初始化的时候左侧全部展开
  75. const moduleMenus = userStore.moduleMenus;
  76. for (const item of moduleMenus) {
  77. openKeys.value.push(item.name);
  78. }
  79. //如果只展开当前页面所在的父菜单
  80. // if (route.matched.length && route.matched.length > 1) {
  81. // const last = route.matched[route.matched.length - 1];
  82. // if (last.meta && Array.isArray(last.meta.breadcrumb))
  83. // last.meta.breadcrumb.map((item) => {
  84. // openKeys.value.push(item.name);
  85. // });
  86. // }
  87. };
  88. </script>
  89. <style lang="less" scoped>
  90. .left-menu {
  91. height: 100%;
  92. :deep(.t-menu__operations) {
  93. padding: 0 !important;
  94. height: 40px;
  95. }
  96. .logo-box {
  97. padding: 10px;
  98. height: 100%;
  99. width: 100%;
  100. span {
  101. font-size: 22px;
  102. color: #ccc;
  103. }
  104. img {
  105. max-height: 100%;
  106. max-width: 100%;
  107. }
  108. }
  109. }
  110. </style>