2023-01-12 10:42:38 +08:00

61 lines
1.7 KiB
Vue

<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>