index.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <template>
  2. <Maximize v-show="maximize" />
  3. <Tabs v-show="tabs" />
  4. <el-main>
  5. <router-view v-slot="{ Component, route }">
  6. <transition appear name="fade-transform" mode="out-in">
  7. <keep-alive :include="keepAliveName">
  8. <component :is="Component" v-if="isRouterShow" :key="route.fullPath" />
  9. </keep-alive>
  10. </transition>
  11. </router-view>
  12. </el-main>
  13. <el-footer v-show="footer">
  14. <Footer />
  15. </el-footer>
  16. </template>
  17. <script setup lang="ts">
  18. import { useDebounceFn } from '@vueuse/core'
  19. import { useGlobalStore } from '@/stores/modules/global'
  20. import { useKeepAliveStore } from '@/stores/modules/keepAlive'
  21. import Maximize from './components/Maximize.vue'
  22. import Tabs from '@/layouts/components/Tabs/index.vue'
  23. import Footer from '@/layouts/components/Footer/index.vue'
  24. const globalStore = useGlobalStore()
  25. const { maximize, isCollapse, layout, tabs, footer } = storeToRefs(globalStore)
  26. const keepAliveStore = useKeepAliveStore()
  27. const { keepAliveName } = storeToRefs(keepAliveStore)
  28. // 注入刷新页面方法
  29. const isRouterShow = ref(true)
  30. const refreshCurrentPage = (val: boolean) => (isRouterShow.value = val)
  31. provide('refresh', refreshCurrentPage)
  32. // 监听当前页面是否最大化,动态添加 class
  33. watch(
  34. () => maximize.value,
  35. () => {
  36. const app = document.getElementById('app') as HTMLElement
  37. if (maximize.value) app.classList.add('main-maximize')
  38. else app.classList.remove('main-maximize')
  39. },
  40. { immediate: true }
  41. )
  42. // 监听布局变化,在 body 上添加相对应的 layout class
  43. watch(
  44. () => layout.value,
  45. () => {
  46. const body = document.body as HTMLElement
  47. body.setAttribute('class', layout.value)
  48. },
  49. { immediate: true }
  50. )
  51. // 监听窗口大小变化,折叠侧边栏
  52. const screenWidth = ref(0)
  53. const listeningWindow = useDebounceFn(() => {
  54. screenWidth.value = document.body.clientWidth
  55. if (!isCollapse.value && screenWidth.value < 1200) globalStore.setGlobalState('isCollapse', true)
  56. if (isCollapse.value && screenWidth.value > 1200) globalStore.setGlobalState('isCollapse', false)
  57. }, 100)
  58. window.addEventListener('resize', listeningWindow, false)
  59. onBeforeUnmount(() => {
  60. window.removeEventListener('resize', listeningWindow)
  61. })
  62. </script>
  63. <style scoped lang="scss">
  64. @import './index.scss';
  65. </style>