You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.5 KiB
96 lines
2.5 KiB
/** |
|
* @program: kicc-ui |
|
* @description: 屏幕断点监听工具 |
|
* @author: wangxiang4 |
|
* @create: 2022/4/10 |
|
*/ |
|
|
|
import { ref, computed, ComputedRef, unref } from 'vue'; |
|
import { useEventListener } from '/@/hooks/event/useEventListener'; |
|
import { screenMap, sizeEnum, screenEnum } from '/@/enums/breakpointEnum'; |
|
|
|
let globalScreenRef: ComputedRef<sizeEnum | undefined>; |
|
let globalWidthRef: ComputedRef<number>; |
|
let globalRealWidthRef: ComputedRef<number>; |
|
|
|
export interface CreateCallbackParams { |
|
screen: ComputedRef<sizeEnum | undefined>; |
|
width: ComputedRef<number>; |
|
realWidth: ComputedRef<number>; |
|
screenEnum: typeof screenEnum; |
|
screenMap: Map<sizeEnum, number>; |
|
sizeEnum: typeof sizeEnum; |
|
} |
|
|
|
export function useBreakpoint() { |
|
return { |
|
screenRef: computed(() => unref(globalScreenRef)), |
|
widthRef: globalWidthRef, |
|
screenEnum, |
|
realWidthRef: globalRealWidthRef, |
|
}; |
|
} |
|
|
|
// 只需调用一次 |
|
export function createBreakpointListen(fn?: (opt: CreateCallbackParams) => void) { |
|
const screenRef = ref<sizeEnum>(sizeEnum.XL); |
|
const realWidthRef = ref(window.innerWidth); |
|
|
|
function getWindowWidth() { |
|
const width = document.body.clientWidth; |
|
const xs = screenMap.get(sizeEnum.XS)!; |
|
const sm = screenMap.get(sizeEnum.SM)!; |
|
const md = screenMap.get(sizeEnum.MD)!; |
|
const lg = screenMap.get(sizeEnum.LG)!; |
|
const xl = screenMap.get(sizeEnum.XL)!; |
|
if (width < xs) { |
|
screenRef.value = sizeEnum.XS; |
|
} else if (width < sm) { |
|
screenRef.value = sizeEnum.SM; |
|
} else if (width < md) { |
|
screenRef.value = sizeEnum.MD; |
|
} else if (width < lg) { |
|
screenRef.value = sizeEnum.LG; |
|
} else if (width < xl) { |
|
screenRef.value = sizeEnum.XL; |
|
} else { |
|
screenRef.value = sizeEnum.XXL; |
|
} |
|
realWidthRef.value = width; |
|
} |
|
|
|
useEventListener({ |
|
el: window, |
|
name: 'resize', |
|
|
|
listener: () => { |
|
getWindowWidth(); |
|
resizeFn(); |
|
}, |
|
// wait: 100, |
|
}); |
|
|
|
getWindowWidth(); |
|
globalScreenRef = computed(() => unref(screenRef)); |
|
globalWidthRef = computed((): number => screenMap.get(unref(screenRef)!)!); |
|
globalRealWidthRef = computed((): number => unref(realWidthRef)); |
|
|
|
function resizeFn() { |
|
fn?.({ |
|
screen: globalScreenRef, |
|
width: globalWidthRef, |
|
realWidth: globalRealWidthRef, |
|
screenEnum, |
|
screenMap, |
|
sizeEnum, |
|
}); |
|
} |
|
|
|
resizeFn(); |
|
return { |
|
screenRef: globalScreenRef, |
|
screenEnum, |
|
widthRef: globalWidthRef, |
|
realWidthRef: globalRealWidthRef, |
|
}; |
|
}
|
|
|