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.
40 lines
859 B
40 lines
859 B
import { tryOnMounted, tryOnUnmounted, useDebounceFn } from '@vueuse/core' |
|
import type { AnyFunction } from '@/utils/types' |
|
|
|
interface UseWindowSizeOptions { |
|
wait?: number |
|
once?: boolean |
|
immediate?: boolean |
|
listenerOptions?: AddEventListenerOptions | boolean |
|
} |
|
|
|
function useWindowSizeFn(fn: AnyFunction, options: UseWindowSizeOptions = {}) { |
|
const { wait = 150, immediate } = options |
|
let handler = () => { |
|
fn() |
|
} |
|
const handleSize = useDebounceFn(handler, wait) |
|
handler = handleSize |
|
|
|
const start = () => { |
|
if (immediate) |
|
handler() |
|
|
|
window.addEventListener('resize', handler) |
|
} |
|
|
|
const stop = () => { |
|
window.removeEventListener('resize', handler) |
|
} |
|
|
|
tryOnMounted(() => { |
|
start() |
|
}) |
|
|
|
tryOnUnmounted(() => { |
|
stop() |
|
}) |
|
return { start, stop } |
|
} |
|
|
|
export { useWindowSizeFn, type UseWindowSizeOptions }
|
|
|