useWindowSizeFn.ts 816 字节
Newer Older
V
Vben 已提交
1
import { tryOnMounted, tryOnUnmounted } from '@vueuse/core';
陈文彬 已提交
2 3 4 5 6 7 8 9
import { useDebounce } from '/@/hooks/core/useDebounce';

interface WindowSizeOptions {
  once?: boolean;
  immediate?: boolean;
  listenerOptions?: AddEventListenerOptions | boolean;
}

V
vben 已提交
10
export function useWindowSizeFn<T>(fn: Fn<T>, wait = 150, options?: WindowSizeOptions) {
陈文彬 已提交
11 12 13 14 15 16
  let handler = () => {
    fn();
  };
  const [handleSize, cancel] = useDebounce(handler, wait, options);
  handler = handleSize;

V
vben 已提交
17
  const start = () => {
V
vben 已提交
18 19 20
    if (options && options.immediate) {
      handler();
    }
陈文彬 已提交
21
    window.addEventListener('resize', handler);
V
vben 已提交
22
  };
V
vben 已提交
23

V
vben 已提交
24
  const stop = () => {
陈文彬 已提交
25 26
    window.removeEventListener('resize', handler);
    cancel();
V
vben 已提交
27 28 29 30 31 32 33 34
  };

  tryOnMounted(() => {
    start();
  });

  tryOnUnmounted(() => {
    stop();
陈文彬 已提交
35
  });
V
vben 已提交
36
  return [start, stop];
陈文彬 已提交
37
}