index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <template>
  2. <el-container style="height: 100vh">
  3. <div
  4. class="mask"
  5. v-show="!isCollapse && !contentFullScreen"
  6. @click="hideMenu"
  7. ></div>
  8. <el-aside
  9. :width="isCollapse ? '60px' : '250px'"
  10. :class="isCollapse ? 'hide-aside' : 'show-side'"
  11. v-show="!contentFullScreen"
  12. >
  13. <Logo v-if="showLogo" />
  14. <Menu />
  15. </el-aside>
  16. <el-container>
  17. <el-header v-show="!contentFullScreen">
  18. <Header />
  19. </el-header>
  20. <Tabs v-show="showTabs" />
  21. <el-main>
  22. <router-view v-slot="{ Component, route }">
  23. <transition
  24. :name="route.meta.transition || 'fade-transform'"
  25. mode="out-in"
  26. >
  27. <keep-alive
  28. v-if="keepAliveComponentsName"
  29. :include="keepAliveComponentsName"
  30. >
  31. <component :is="Component" :key="route.fullPath" />
  32. </keep-alive>
  33. <component v-else :is="Component" :key="route.fullPath" />
  34. </transition>
  35. <Feedback />
  36. </router-view>
  37. </el-main>
  38. </el-container>
  39. </el-container>
  40. </template>
  41. <script lang="js">
  42. import { defineComponent, computed, onBeforeMount } from "vue";
  43. import { useStore } from "vuex";
  44. import { useRouter } from "vue-router";
  45. import { useEventListener } from "@vueuse/core";
  46. import Menu from "./Menu/index.vue";
  47. import Logo from "./Logo/index.vue";
  48. import Header from "./Header/index.vue";
  49. import Tabs from "./Tabs/index.vue";
  50. import Feedback from "./Feedback/index.vue"
  51. export default defineComponent({
  52. components: {
  53. Menu,
  54. Logo,
  55. Header,
  56. Tabs,
  57. Feedback,
  58. },
  59. setup() {
  60. const store = useStore();
  61. // computed
  62. const isCollapse = computed(() => store.state.app.isCollapse);
  63. const contentFullScreen = computed(() => store.state.app.contentFullScreen);
  64. const showLogo = computed(() => store.state.app.showLogo);
  65. const showTabs = computed(() => store.state.app.showTabs);
  66. const keepAliveComponentsName = computed(() => store.getters['keepAlive/keepAliveComponentsName']);
  67. // 页面宽度变化监听后执行的方法
  68. const resizeHandler = () => {
  69. if (document.body.clientWidth <= 1000 && !isCollapse.value) {
  70. store.commit("app/isCollapseChange", true);
  71. } else if (document.body.clientWidth > 1000 && isCollapse.value) {
  72. store.commit("app/isCollapseChange", false);
  73. }
  74. };
  75. // 初始化调用
  76. resizeHandler();
  77. // beforeMount
  78. onBeforeMount(() => {
  79. // 监听页面变化
  80. useEventListener("resize", resizeHandler);
  81. });
  82. // methods
  83. // 隐藏菜单
  84. const hideMenu = () => {
  85. store.commit("app/isCollapseChange", true);
  86. };
  87. return {
  88. isCollapse,
  89. showLogo,
  90. showTabs,
  91. contentFullScreen,
  92. keepAliveComponentsName,
  93. hideMenu,
  94. };
  95. },
  96. });
  97. </script>
  98. <style lang="scss" scoped>
  99. .el-header {
  100. padding-left: 0;
  101. padding-right: 0;
  102. }
  103. .el-aside {
  104. display: flex;
  105. flex-direction: column;
  106. transition: 0.2s;
  107. overflow-x: hidden;
  108. transition: 0.3s;
  109. &::-webkit-scrollbar {
  110. width: 0 !important;
  111. }
  112. }
  113. .el-main {
  114. background-color: var(--system-container-background);
  115. height: 100%;
  116. padding: 0;
  117. overflow-x: hidden;
  118. }
  119. :deep(.el-main-box) {
  120. width: 100%;
  121. height: 100%;
  122. overflow-y: auto;
  123. box-sizing: border-box;
  124. }
  125. @media screen and (max-width: 1000px) {
  126. .el-aside {
  127. position: fixed;
  128. top: 0;
  129. left: 0;
  130. height: 100vh;
  131. z-index: 1000;
  132. &.hide-aside {
  133. left: -250px;
  134. }
  135. }
  136. .mask {
  137. position: fixed;
  138. top: 0;
  139. left: 0;
  140. width: 100vw;
  141. height: 100vh;
  142. z-index: 999;
  143. background: rgba(0, 0, 0, 0.5);
  144. }
  145. }
  146. </style>