import { onMounted, onBeforeMount, onBeforeUnmount } from 'vue'; import { useDebounceFn } from '@vueuse/core'; import { useAppStore } from '@/store'; import { addEventListen, removeEventListen } from '@/utils/event'; const WIDTH = 992; // https://arco.design/vue/component/grid#responsivevalue function queryDevice() { const rect = document.body.getBoundingClientRect(); return rect.width - 1 < WIDTH; } export default function useResponsive(immediate?: boolean) { const appStore = useAppStore(); function resizeHandler() { if (!document.hidden) { const isMobile = queryDevice(); appStore.toggleDevice(isMobile ? 'mobile' : 'desktop'); appStore.toggleMenu(isMobile); } } const debounceFn = useDebounceFn(resizeHandler, 100); onMounted(() => { if (immediate) debounceFn(); }); onBeforeMount(() => { addEventListen(window, 'resize', debounceFn); }); onBeforeUnmount(() => { removeEventListen(window, 'resize', debounceFn); }); }