123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- <template>
- <div>
- <div :class="sideClass + ' drop-shadow-md overflow-y'">
- <!--logo -->
- <Logo />
- <!-- menu item -->
- <Menu :menu-class="menuClass" />
- </div>
- <Mask v-if="isMobile && appStore.isExpand" @click="appStore.changeExpaned()" />
- </div>
- </template>
- <script lang="ts" setup>
- import { useAppStore } from '/admin/stores/modules/app'
- import { computed, onMounted, ref, watch } from 'vue'
- import { isMiniScreen } from '/admin/support/helper'
- const isMobile = ref(isMiniScreen())
- 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'
- const layoutSideOpenClass = 'w-56' + layoutSide
- const layoutSideHiddenClass = 'w-0 sm:w-16' + layoutSide
- // 是否是小屏幕
- const sideClass = computed(() => {
- return appStore.isExpand ? layoutSideOpenClass : layoutSideHiddenClass
- })
- // menu class
- const menuClass = ref<string>()
- // 判断展开状态
- const appStore = useAppStore()
- watch(appStore.$state, state => {
- // 如果切换到小屏幕,并且是菜单是收缩状态
- menuClass.value = isExpandWhenInMobile()
- })
- // 监控屏幕大小
- onMounted(() => {
- window.onresize = () => {
- return (() => {
- // 如果切换到小屏幕,并且是菜单是收缩状态,则隐藏子菜单
- isMobile.value = isMiniScreen()
- menuClass.value = isExpandWhenInMobile()
- })()
- }
- // 刷新或者 go back 的时候默认展开菜单
- appStore.isExpand = true
- })
- function isExpandWhenInMobile(): string {
- return !appStore.isExpand && isMobile.value ? 'hidden' : ''
- }
- </script>
- <style scoped>
- .sider-bg {
- background-color: var(--sider-menu-bg-color);
- }
- </style>
|