From 07158c8db4ef41f319be8c3abb812bdeba2ba0bf Mon Sep 17 00:00:00 2001 From: pany <939630029@qq.com> Date: Mon, 22 Aug 2022 16:57:55 +0800 Subject: [PATCH] refactor: useResize hook --- src/layout/hooks/useResize.ts | 51 ++++++++++++++++++++++++++ src/layout/index.vue | 37 +++++++------------ src/layout/useResize.ts | 67 ----------------------------------- 3 files changed, 64 insertions(+), 91 deletions(-) create mode 100644 src/layout/hooks/useResize.ts delete mode 100644 src/layout/useResize.ts diff --git a/src/layout/hooks/useResize.ts b/src/layout/hooks/useResize.ts new file mode 100644 index 0000000..c1dc55b --- /dev/null +++ b/src/layout/hooks/useResize.ts @@ -0,0 +1,51 @@ +import { watch, onBeforeMount, onMounted, onBeforeUnmount } from "vue" +import { useRoute } from "vue-router" +import { useAppStore, DeviceType } from "@/store/modules/app" + +/** 参考 Bootstrap 的响应式设计 WIDTH = 992 */ +const WIDTH = 992 + +/** 根据大小变化重新布局 */ +export default () => { + const route = useRoute() + const appStore = useAppStore() + + const _isMobile = () => { + const rect = document.body.getBoundingClientRect() + return rect.width - 1 < WIDTH + } + + const _resizeHandler = () => { + if (!document.hidden) { + const isMobile = _isMobile() + appStore.toggleDevice(isMobile ? DeviceType.Mobile : DeviceType.Desktop) + if (isMobile) { + appStore.closeSidebar(true) + } + } + } + + watch( + () => route.name, + () => { + if (appStore.device === DeviceType.Mobile && appStore.sidebar.opened) { + appStore.closeSidebar(false) + } + } + ) + + onBeforeMount(() => { + window.addEventListener("resize", _resizeHandler) + }) + + onMounted(() => { + if (_isMobile()) { + appStore.toggleDevice(DeviceType.Mobile) + appStore.closeSidebar(true) + } + }) + + onBeforeUnmount(() => { + window.removeEventListener("resize", _resizeHandler) + }) +} diff --git a/src/layout/index.vue b/src/layout/index.vue index f372175..342ee47 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -1,25 +1,22 @@