Home.vue 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <script setup lang="ts">
  2. import logo from '@assets/images/logo.webp';
  3. import MenuBtnGroup from './menu-btn-group/index.vue';
  4. import User from './user/index.vue';
  5. import Local from './local/index.vue';
  6. import Menu from './menu/index.vue';
  7. import {NLayout, NLayoutContent, NScrollbar} from 'naive-ui';
  8. import TabList from './tab/index.vue';
  9. import {RouterView, useRoute} from 'vue-router';
  10. import {computed} from 'vue';
  11. import {useTabStore} from '@stores';
  12. import {RouteNameMap} from '@routes';
  13. import {useQuery} from '@tanstack/vue-query';
  14. import {getMenuByUserId} from '@apis';
  15. defineOptions({
  16. name: 'Home',
  17. });
  18. const {suspense} = useQuery({
  19. queryKey: [getMenuByUserId.name],
  20. async queryFn({signal}) {
  21. const data = await getMenuByUserId(signal);
  22. return data;
  23. },
  24. suspense: true,
  25. });
  26. await suspense();
  27. const route = useRoute();
  28. const tabStore = useTabStore();
  29. // 只保留tab上有的页面 销毁的不考虑
  30. const keepaliveKeys = computed(function() {
  31. return tabStore.tabList.map(function(val) {
  32. return RouteNameMap.get(val.url);
  33. });
  34. });
  35. </script>
  36. <template>
  37. <div class="container">
  38. <header>
  39. <section class="logo" @click="tabStore.setActiveKey('-1')">
  40. <img :src="logo" alt="logo" />
  41. <h1 v-t="'common.title'" />
  42. </section>
  43. <MenuBtnGroup />
  44. <User />
  45. <Local />
  46. </header>
  47. <NLayout class="content" hasSider>
  48. <Menu />
  49. <NLayoutContent>
  50. <section class="content-info">
  51. <TabList />
  52. <NScrollbar>
  53. <div class="content-main">
  54. <RouterView #="{Component}">
  55. <KeepAlive :include="keepaliveKeys">
  56. <component :is="Component" :key="route.path" />
  57. </KeepAlive>
  58. </RouterView>
  59. </div>
  60. </NScrollbar>
  61. </section>
  62. </NLayoutContent>
  63. </NLayout>
  64. </div>
  65. </template>
  66. <style scoped>
  67. @import './index.css';
  68. </style>