tdesign-mobile-vue
Version:
tdesign-mobile-vue
1 lines • 6.44 kB
Source Map (JSON)
{"version":3,"file":"useLockScroll.mjs","sources":["../../src/hooks/useLockScroll.ts"],"sourcesContent":["import { Ref, watch, onMounted, onActivated, onBeforeUnmount, onDeactivated, nextTick } from 'vue';\nimport { useTouch } from '../_util/useTouch';\nimport getScrollParent from '../_util/getScrollParent';\n\nconst totalLockCount = new Map<String, number>();\nlet mounted: boolean = null;\n\n// 移植自vant:https://github.com/youzan/vant/blob/HEAD/src/composables/use-lock-scroll.ts\nexport function useLockScroll(rootRef: Ref<HTMLElement | undefined>, shouldLock: () => boolean, componentName: string) {\n const touch = useTouch();\n const BODY_LOCK_CLASS = `${componentName}--lock`;\n\n const onTouchMove = (event: TouchEvent) => {\n touch.move(event);\n\n const direction = touch.deltaY.value > 0 ? '10' : '01';\n const el = getScrollParent(event.target as Element, rootRef.value) as HTMLElement;\n if (!el) return;\n const { scrollHeight, offsetHeight, scrollTop } = el;\n let status = '11';\n\n if (scrollTop === 0) {\n status = offsetHeight >= scrollHeight ? '00' : '01';\n } else if (scrollTop + offsetHeight >= scrollHeight) {\n status = '10';\n }\n\n if (status !== '11' && touch.isVertical() && !(parseInt(status, 2) & parseInt(direction, 2))) {\n if (event.cancelable) {\n event.preventDefault();\n }\n }\n };\n\n const lock = () => {\n document.addEventListener('touchstart', touch.start);\n document.addEventListener('touchmove', onTouchMove, { passive: false });\n\n if (!totalLockCount.get(BODY_LOCK_CLASS)) {\n document.body.classList.add(BODY_LOCK_CLASS);\n }\n\n totalLockCount.set(BODY_LOCK_CLASS, (totalLockCount.get(BODY_LOCK_CLASS) ?? 0) + 1);\n };\n\n const unlock = () => {\n const sum = Array.from(totalLockCount.values()).reduce((acc, val) => acc + val, 0);\n if (sum) {\n document.removeEventListener('touchstart', touch.start);\n document.removeEventListener('touchmove', onTouchMove);\n\n totalLockCount.set(BODY_LOCK_CLASS, Math.max((totalLockCount.get(BODY_LOCK_CLASS) ?? 0) - 1, 0));\n\n if (!totalLockCount.get(BODY_LOCK_CLASS)) {\n document.body.classList.remove(BODY_LOCK_CLASS);\n }\n }\n };\n\n const init = () => shouldLock() && lock();\n\n const destroy = () => shouldLock() && unlock();\n\n onMounted(() => {\n init();\n nextTick(() => {\n mounted = true;\n });\n });\n\n onActivated(() => {\n if (mounted) {\n init();\n }\n });\n\n onDeactivated(destroy);\n onBeforeUnmount(destroy);\n\n watch(shouldLock, (value) => {\n value ? lock() : unlock();\n });\n}\n"],"names":["totalLockCount","Map","mounted","useLockScroll","rootRef","shouldLock","componentName","touch","useTouch","BODY_LOCK_CLASS","onTouchMove","event","move","direction","deltaY","value","el","getScrollParent","target","scrollHeight","offsetHeight","scrollTop","status","isVertical","parseInt","cancelable","preventDefault","lock","_totalLockCount$get","document","addEventListener","start","passive","get","body","classList","add","set","unlock","sum","Array","from","values","reduce","acc","val","_totalLockCount$get2","removeEventListener","Math","max","remove","init","destroy","onMounted","nextTick","onActivated","onDeactivated","onBeforeUnmount","watch"],"mappings":"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"}