diff --git a/src/layouts/naive-ui/AppLayout.vue b/src/layouts/naive-ui/AppLayout.vue index f94baaf..f6605b1 100644 --- a/src/layouts/naive-ui/AppLayout.vue +++ b/src/layouts/naive-ui/AppLayout.vue @@ -5,8 +5,48 @@ import { createGetRoutes } from '@/plugins/router'; const router = useRouter(); -// 侧边栏折叠状态 +// 响应式断点检测 +const isMobile = ref(false); +const isTablet = ref(false); + +// 检测屏幕尺寸 +const updateScreenSize = () => { + const width = window.innerWidth; + const wasMobile = isMobile.value; + + isMobile.value = width < 768; + isTablet.value = width >= 768 && width < 1024; + + // 当从移动端切换到桌面端时,关闭抽屉并重置折叠状态 + if (wasMobile && !isMobile.value) { + drawerVisible.value = false; + collapsed.value = false; + } + // 当从桌面端切换到移动端时,关闭抽屉 + else if (!wasMobile && isMobile.value) { + drawerVisible.value = false; + } +}; + +// 侧边栏状态管理 const collapsed = ref(false); +const drawerVisible = ref(false); + +// 初始化屏幕尺寸检测 +onMounted(() => { + updateScreenSize(); + window.addEventListener('resize', updateScreenSize); + + // 移动端默认收起侧边栏 + if (isMobile.value) { + collapsed.value = true; + drawerVisible.value = false; + } +}); + +onUnmounted(() => { + window.removeEventListener('resize', updateScreenSize); +}); // 菜单项类型定义 type MenuItemWithRoute = MenuOption & { @@ -124,6 +164,11 @@ const handleMenuSelect = (key: string, item: MenuOption) => { const routeName = menuRouteMap.get(key) || (item as MenuItemWithRoute).routeName; if (routeName) { router.push({ name: routeName as never }); + + // 移动端点击菜单项后自动收起侧边栏 + if (isMobile.value) { + drawerVisible.value = false; + } } }; @@ -144,15 +189,37 @@ watch( { immediate: true }, ); -// 切换侧边栏折叠状态 -const toggleCollapsed = () => { - collapsed.value = !collapsed.value; +// 切换侧边栏状态 +const toggleSidebar = () => { + if (isMobile.value) { + // 移动端使用抽屉模式 + drawerVisible.value = !drawerVisible.value; + } else { + // 桌面端使用折叠模式 + collapsed.value = !collapsed.value; + } };