UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 16.6 kB
{"version":3,"file":"useVirtualScroll.mjs","sources":["../../src/hooks/useVirtualScroll.ts"],"sourcesContent":["import { ref, toRefs, reactive, onMounted, computed, watch, nextTick } from 'vue';\n\nconst useVirtualScroll = ({\n data,\n container,\n fixedHeight = false,\n lineHeight = 30,\n bufferSize = 20,\n threshold = 100,\n}: {\n data: any;\n container: any;\n fixedHeight: boolean;\n lineHeight: number;\n bufferSize: number;\n threshold: number;\n}) => {\n const state = reactive({\n visibleData: [],\n cachedHeight: [],\n cachedScrollY: [],\n });\n const isVirtual = computed(() => data.value.length > threshold);\n const updateId = ref(0);\n const trs = new Map();\n\n let visibleCount = 0;\n let beforeScrollTop = 0;\n let index = 0;\n let offset = 0;\n let start = 0;\n let last = 0;\n\n const reset = () => {\n data.value.forEach((item: any, i: number) => {\n item.$index = i;\n if (fixedHeight) {\n state.cachedScrollY[i] = i * lineHeight;\n }\n });\n if (!fixedHeight) {\n state.cachedScrollY[data.value.length - 1] = undefined; // 初始化cachedScrollY数组的长度\n }\n };\n reset();\n\n const scrollHeight = computed(() => {\n const { cachedHeight } = state;\n const { length } = cachedHeight;\n if (length) {\n const maxScrollY = cachedHeight.reduce((sum, v) => sum + v || lineHeight, 0); // 当前总高度\n if (cachedHeight.length === data.value.length) {\n return maxScrollY;\n }\n const average = maxScrollY / cachedHeight.length; // 平均高度\n return maxScrollY + (data.value.length - cachedHeight.length) * average; // 预估总高度\n }\n return isVirtual.value ? data.value.length * lineHeight : 0;\n });\n const translateY = computed(() => {\n const { visibleData } = state;\n const firstRow = visibleData[0];\n if (firstRow) {\n return visibleData.length === 1 ? 0 : state.cachedScrollY[firstRow.$index];\n }\n return 0;\n });\n\n const updateVisibleData = () => {\n last = Math.min(start + visibleCount + bufferSize * 2, data.value.length);\n state.visibleData = data.value.slice(start, last);\n };\n const calculateScrollY = () => {\n const anchorDom = trs.get(index);\n if (!anchorDom) {\n return; \n }\n const anchorDomHeight = anchorDom?.getBoundingClientRect()?.height; \n state.cachedScrollY[index] = container.value.scrollTop - offset; \n state.cachedHeight[index] = anchorDomHeight;\n\n for (let i = index + 1; i <= state.visibleData[state.visibleData.length - 1]?.$index; i++) {\n const tr = trs.get(i);\n const { height } = tr?.getBoundingClientRect() || {};\n state.cachedHeight[i] = height;\n const scrollY = state.cachedScrollY[i - 1] + state.cachedHeight[i - 1]; \n // state.cachedScrollY[i] = scrollY;\n state.cachedScrollY.splice(i, 1, scrollY); \n }\n\n for (let i = index - 1; i >= state.visibleData[0]?.$index; i--) {\n const tr = trs.get(i);\n const { height } = tr?.getBoundingClientRect() || {};\n state.cachedHeight[i] = height;\n const scrollY = state.cachedScrollY[i + 1] - state.cachedHeight[i]; \n // state.cachedScrollY[i] = scrollY;\n state.cachedScrollY.splice(i, 1, scrollY);\n }\n if (state.cachedScrollY[0] > 0) {\n // revising = true;\n const distance = state.cachedScrollY[0]; \n const length = Math.min(last, data.value.length);\n for (let i = 0; i < length; i++) {\n // state.cachedScrollY[i] -= distance;\n state.cachedScrollY.splice(i, 1, state.cachedScrollY[i] - distance);\n }\n\n const scrollTop = state.cachedScrollY[index - 1] ? state.cachedScrollY[index - 1] + offset : offset;\n container.value.scrollTop = scrollTop;\n beforeScrollTop = scrollTop;\n // revising = false;\n }\n if (state.cachedScrollY[start] < 0) {\n // revising = true;\n const s = state.cachedHeight.slice(0, Math.max(0, index)).reduce((sum, v) => sum + v, 0) + offset;\n container.value.scrollTop = s;\n beforeScrollTop = s;\n if (s === 0) {\n index = 0;\n offset = 0;\n }\n // revising = false;\n }\n nextTick(() => {\n const { scrollTop, scrollHeight, clientHeight } = container.value;\n if (scrollTop + clientHeight === scrollHeight) {\n // revising = true;\n for (let i = last - 1; i >= start; i--) {\n if (i === last - 1) {\n // state.cachedScrollY[i] = scrollHeight.value - state.cachedHeight[i];\n state.cachedScrollY.splice(i, 1, scrollHeight.value - state.cachedHeight[i]);\n } else {\n // state.cachedScrollY[i] = state.cachedScrollY[i + 1] - state.cachedHeight[i];\n state.cachedScrollY.splice(i, 1, state.cachedScrollY[i + 1] - state.cachedHeight[i]);\n }\n }\n // revising = false;\n }\n });\n };\n\n const handleScroll = () => {\n if (!isVirtual.value) return;\n // if (revising) {\n // return false;\n // }\n const { scrollTop } = container.value;\n let distance = scrollTop - beforeScrollTop; \n beforeScrollTop = scrollTop;\n distance += offset;\n let lastIndex = index;\n if (!distance) return;\n if (distance >= 0) {\n // 向下滚动\n while (lastIndex < data.value.length && distance > (state.cachedHeight[lastIndex] || lineHeight)) {\n if (!state.cachedHeight[lastIndex]) {\n state.cachedHeight[lastIndex] = lineHeight;\n }\n distance -= state.cachedHeight[lastIndex];\n lastIndex++;\n }\n if (lastIndex >= data.value.length) {\n index = data.value.length - 1;\n offset = 0;\n } else {\n index = lastIndex;\n offset = distance;\n }\n const { clientHeight, scrollHeight } = container.value;\n if (scrollTop + clientHeight === scrollHeight) {\n index = data.value.length - visibleCount + 1;\n // calculateScrollY();\n }\n if (start <= index - bufferSize) {\n start = Math.min(data.value.length - visibleCount, index - bufferSize);\n if (start < 0) {\n start = 0;\n }\n }\n } else {\n while (distance < 0) {\n lastIndex--;\n if (!state.cachedHeight[lastIndex]) {\n state.cachedHeight[lastIndex] = lineHeight;\n }\n distance += state.cachedHeight[lastIndex];\n }\n if (lastIndex < 0) {\n index = 0;\n offset = 0;\n } else {\n index = lastIndex;\n offset = distance;\n }\n calculateScrollY();\n if (start > index - bufferSize) {\n start = Math.max(0, index - bufferSize);\n }\n }\n updateVisibleData();\n };\n\n !fixedHeight && watch(updateId, calculateScrollY, { flush: 'post' });\n const handleRowMounted = () => {\n if (!isVirtual.value) return;\n updateId.value++;\n };\n watch(data, () => {\n reset();\n state.visibleData = [];\n state.cachedScrollY = [];\n state.cachedHeight = [];\n beforeScrollTop = 0;\n index = 0;\n offset = 0;\n start = 0;\n // revising = false;\n trs.clear();\n if (data.value.length <= threshold) {\n state.visibleData = data.value;\n } else {\n updateVisibleData();\n }\n\n container.value && (container.value.scrollTop = 0);\n });\n let mounted = false;\n const refreshContainer = () => {\n if (mounted) {\n visibleCount = Math.ceil(container.value.offsetHeight / lineHeight);\n updateVisibleData();\n }\n };\n onMounted(() => {\n if (!window || !window.IntersectionObserver) {\n return;\n }\n const ob = new window.IntersectionObserver((entries) => {\n const entry = entries[0];\n if (entry.isIntersecting || entry.intersectionRatio) {\n mounted = true;\n isVirtual.value && refreshContainer();\n ob.unobserve(container.value);\n }\n });\n container.value && ob.observe(container.value);\n });\n return {\n trs,\n scrollHeight,\n ...toRefs(state),\n translateY,\n handleScroll,\n handleRowMounted,\n refreshContainer,\n fixedHeight,\n calculateScrollY,\n };\n};\nexport default useVirtualScroll;\n"],"names":["fixedHeight","lineHeight","bufferSize","threshold","visibleData","cachedHeight","cachedScrollY","state","reset","last","container","beforeScrollTop","index","offset","nextTick","distance","lastIndex","start","calculateScrollY","updateVisibleData","flush","visibleCount","onMounted","mounted","isVirtual","ob","trs","scrollHeight","translateY","handleScroll","handleRowMounted","refreshContainer"],"mappings":"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"}