UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 9.8 kB
{"version":3,"file":"index.mjs","sources":["../../../../../../packages/components/infinite-scroll/src/index.ts"],"sourcesContent":["// @ts-nocheck\nimport { nextTick } from 'vue'\nimport { throttle } from 'lodash-unified'\nimport {\n getOffsetTopDistance,\n getScrollContainer,\n isFunction,\n throwError,\n} from '@element-plus/utils'\nimport { useDeprecated } from '@element-plus/hooks'\n\nimport type { ComponentPublicInstance, ObjectDirective } from 'vue'\n\nexport const SCOPE = 'ElInfiniteScroll'\nexport const CHECK_INTERVAL = 50\nexport const DEFAULT_DELAY = 200\nexport const DEFAULT_DISTANCE = 0\n\nconst attributes = {\n delay: {\n type: Number,\n default: DEFAULT_DELAY,\n },\n distance: {\n type: Number,\n default: DEFAULT_DISTANCE,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n immediate: {\n type: Boolean,\n default: true,\n },\n}\n\ntype Attrs = typeof attributes\ntype ScrollOptions = { [K in keyof Attrs]: Attrs[K]['default'] }\ntype InfiniteScrollCallback = () => void\ntype InfiniteScrollEl = HTMLElement & {\n [SCOPE]: {\n container: HTMLElement | Window\n containerEl: HTMLElement\n instance: ComponentPublicInstance\n delay: number // export for test\n lastScrollTop: number\n cb: InfiniteScrollCallback\n onScroll: () => void\n observer?: MutationObserver\n }\n}\n\nconst getScrollOptions = (\n el: HTMLElement,\n instance: ComponentPublicInstance\n): ScrollOptions => {\n return Object.entries(attributes).reduce((acm, [name, option]) => {\n const { type, default: defaultValue } = option\n const attrVal = el.getAttribute(`infinite-scroll-${name}`)\n let value = instance[attrVal] ?? attrVal ?? defaultValue\n value = value === 'false' ? false : value\n value = type(value)\n acm[name] = Number.isNaN(value) ? defaultValue : value\n return acm\n }, {} as ScrollOptions)\n}\n\nconst destroyObserver = (el: InfiniteScrollEl) => {\n const { observer } = el[SCOPE]\n\n if (observer) {\n observer.disconnect()\n delete el[SCOPE].observer\n }\n}\n\nconst handleScroll = (el: InfiniteScrollEl, cb: InfiniteScrollCallback) => {\n const { container, containerEl, instance, observer, lastScrollTop } =\n el[SCOPE]\n const { disabled, distance } = getScrollOptions(el, instance)\n const { clientHeight, scrollHeight, scrollTop } = containerEl\n const delta = scrollTop - lastScrollTop\n\n el[SCOPE].lastScrollTop = scrollTop\n\n // trigger only if full check has done and not disabled and scroll down\n if (observer || disabled || delta < 0) return\n\n let shouldTrigger = false\n\n if (container === el) {\n shouldTrigger = scrollHeight - (clientHeight + scrollTop) <= distance\n } else {\n // get the scrollHeight since el might be visible overflow\n const { clientTop, scrollHeight: height } = el\n const offsetTop = getOffsetTopDistance(el, containerEl)\n shouldTrigger =\n scrollTop + clientHeight >= offsetTop + clientTop + height - distance\n }\n\n if (shouldTrigger) {\n cb.call(instance)\n }\n}\n\nfunction checkFull(el: InfiniteScrollEl, cb: InfiniteScrollCallback) {\n const { containerEl, instance } = el[SCOPE]\n const { disabled } = getScrollOptions(el, instance)\n\n if (disabled || containerEl.clientHeight === 0) return\n\n if (containerEl.scrollHeight <= containerEl.clientHeight) {\n cb.call(instance)\n } else {\n destroyObserver(el)\n }\n}\n\nconst InfiniteScroll: ObjectDirective<\n InfiniteScrollEl,\n InfiniteScrollCallback\n> = {\n async mounted(el, binding) {\n const { instance, value: cb } = binding\n\n useDeprecated(\n {\n scope: SCOPE,\n from: 'the directive v-infinite-scroll',\n replacement: 'the el-scrollbar infinite scroll',\n version: '3.0.0',\n ref: 'https://element-plus.org/en-US/component/scrollbar#infinite-scroll',\n },\n true\n )\n\n if (!isFunction(cb)) {\n throwError(SCOPE, \"'v-infinite-scroll' binding value must be a function\")\n }\n\n // ensure parentNode mounted\n await nextTick()\n\n const { delay, immediate } = getScrollOptions(el, instance)\n const container = getScrollContainer(el, true)\n const containerEl =\n container === window\n ? document.documentElement\n : (container as HTMLElement)\n const onScroll = throttle(handleScroll.bind(null, el, cb), delay)\n\n if (!container) return\n\n el[SCOPE] = {\n instance,\n container,\n containerEl,\n delay,\n cb,\n onScroll,\n lastScrollTop: containerEl.scrollTop,\n }\n\n if (immediate) {\n const observer = new MutationObserver(\n throttle(checkFull.bind(null, el, cb), CHECK_INTERVAL)\n )\n el[SCOPE].observer = observer\n observer.observe(el, { childList: true, subtree: true })\n checkFull(el, cb)\n }\n\n container.addEventListener('scroll', onScroll)\n },\n unmounted(el) {\n if (!el[SCOPE]) return\n const { container, onScroll } = el[SCOPE]\n\n container?.removeEventListener('scroll', onScroll)\n destroyObserver(el)\n },\n async updated(el) {\n if (!el[SCOPE]) {\n await nextTick()\n } else {\n const { containerEl, cb, observer } = el[SCOPE]\n if (containerEl.clientHeight && observer) {\n checkFull(el, cb)\n }\n }\n },\n}\n\nexport default InfiniteScroll\n"],"names":[],"mappings":"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"}