UNPKG

create-iking-admin

Version:

金合技术中台脚手架

74 lines (65 loc) 1.78 kB
/* * @Author: wfl * @LastEditors: wfl * @description: * @updateInfo: * @Date: 2022-08-12 18:42:51 * @LastEditTime: 2022-08-29 10:06:01 */ import type { Ref } from 'vue'; import { useThrottleFn } from '@vueuse/core'; import { paramType } from 'iking-utils'; import { onMounted, onUnmounted, ref, watch } from 'vue'; export function useScroll( refEl: Ref<Element | Window | null>, options?: { wait?: number; leading?: boolean; trailing?: boolean; }, ) { const refX = ref(0); const refY = ref(0); let handler = () => { if (paramType.isWindow(refEl.value)) { refX.value = refEl.value.scrollX; refY.value = refEl.value.scrollY; } else if (refEl.value) { refX.value = (refEl.value as Element).scrollLeft; refY.value = (refEl.value as Element).scrollTop; } }; if (paramType.isObject(options)) { let wait = 0; if (options.wait && options.wait > 0) { wait = options.wait; Reflect.deleteProperty(options, 'wait'); } handler = useThrottleFn(handler, wait); } let stopWatch: () => void; onMounted(() => { stopWatch = watch( refEl, (el, prevEl, onCleanup) => { if (el) { el.addEventListener('scroll', handler); } else if (prevEl) { prevEl.removeEventListener('scroll', handler); } onCleanup(() => { refX.value = refY.value = 0; el && el.removeEventListener('scroll', handler); }); }, { immediate: true }, ); }); onUnmounted(() => { refEl.value && refEl.value.removeEventListener('scroll', handler); }); function stop() { stopWatch && stopWatch(); } return { refX, refY, stop }; }