sider.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <template>
  2. <div>
  3. <div :class="sideClass + ' drop-shadow-md overflow-y'">
  4. <!--logo -->
  5. <Logo />
  6. <!-- menu item -->
  7. <Menu :menu-class="menuClass" />
  8. </div>
  9. <Mask v-if="isMobile && appStore.isExpand" @click="appStore.changeExpaned()" />
  10. </div>
  11. </template>
  12. <script lang="ts" setup>
  13. import { useAppStore } from '/admin/stores/modules/app'
  14. import { computed, onMounted, ref, watch } from 'vue'
  15. import { isMiniScreen } from '/admin/support/helper'
  16. const isMobile = ref(isMiniScreen())
  17. const layoutSide = ' h-screen z-[1000] sm:z-0 absolute top-0 left-0 sm:fixed transition-width duration-300 ease-linear sider-bg overflow-auto'
  18. const layoutSideOpenClass = 'w-56' + layoutSide
  19. const layoutSideHiddenClass = 'w-0 sm:w-16' + layoutSide
  20. // 是否是小屏幕
  21. const sideClass = computed(() => {
  22. return appStore.isExpand ? layoutSideOpenClass : layoutSideHiddenClass
  23. })
  24. // menu class
  25. const menuClass = ref<string>()
  26. // 判断展开状态
  27. const appStore = useAppStore()
  28. watch(appStore.$state, state => {
  29. // 如果切换到小屏幕,并且是菜单是收缩状态
  30. menuClass.value = isExpandWhenInMobile()
  31. })
  32. // 监控屏幕大小
  33. onMounted(() => {
  34. window.onresize = () => {
  35. return (() => {
  36. // 如果切换到小屏幕,并且是菜单是收缩状态,则隐藏子菜单
  37. isMobile.value = isMiniScreen()
  38. menuClass.value = isExpandWhenInMobile()
  39. })()
  40. }
  41. // 刷新或者 go back 的时候默认展开菜单
  42. appStore.isExpand = true
  43. })
  44. function isExpandWhenInMobile(): string {
  45. return !appStore.isExpand && isMobile.value ? 'hidden' : ''
  46. }
  47. </script>
  48. <style scoped>
  49. .sider-bg {
  50. background-color: var(--sider-menu-bg-color);
  51. }
  52. </style>