useBreakpoint.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { ref, computed, ComputedRef, unref } from 'vue';
  2. import { useEventListener } from '/@/hooks/event/useEventListener';
  3. import { screenMap, sizeEnum, screenEnum } from '/@/enums/breakpointEnum';
  4. let globalScreenRef: ComputedRef<sizeEnum | undefined>;
  5. let globalWidthRef: ComputedRef<number>;
  6. let globalRealWidthRef: ComputedRef<number>;
  7. export function useBreakpoint() {
  8. return {
  9. screenRef: computed(() => unref(globalScreenRef)),
  10. widthRef: globalWidthRef,
  11. screenEnum,
  12. realWidthRef: globalRealWidthRef,
  13. };
  14. }
  15. // Just call it once
  16. export function createBreakpointListen(fn?: Fn) {
  17. const screenRef = ref<sizeEnum>(sizeEnum.XL);
  18. const realWidthRef = ref(window.innerWidth);
  19. function getWindowWidth() {
  20. const width = document.body.clientWidth;
  21. const xs = screenMap.get(sizeEnum.XS)!;
  22. const sm = screenMap.get(sizeEnum.SM)!;
  23. const md = screenMap.get(sizeEnum.MD)!;
  24. const lg = screenMap.get(sizeEnum.LG)!;
  25. const xl = screenMap.get(sizeEnum.XL)!;
  26. if (width < xs) {
  27. screenRef.value = sizeEnum.XS;
  28. } else if (width < sm) {
  29. screenRef.value = sizeEnum.SM;
  30. } else if (width < md) {
  31. screenRef.value = sizeEnum.MD;
  32. } else if (width < lg) {
  33. screenRef.value = sizeEnum.LG;
  34. } else if (width < xl) {
  35. screenRef.value = sizeEnum.XL;
  36. } else {
  37. screenRef.value = sizeEnum.XXL;
  38. }
  39. realWidthRef.value = width;
  40. }
  41. useEventListener({
  42. el: window,
  43. name: 'resize',
  44. listener: () => {
  45. fn && fn();
  46. getWindowWidth();
  47. },
  48. });
  49. getWindowWidth();
  50. globalScreenRef = computed(() => unref(screenRef));
  51. globalWidthRef = computed((): number => screenMap.get(unref(screenRef)!)!);
  52. globalRealWidthRef = computed((): number => unref(realWidthRef));
  53. return {
  54. screenRef: globalScreenRef,
  55. screenEnum,
  56. widthRef: globalWidthRef,
  57. realWidthRef: globalRealWidthRef,
  58. };
  59. }