UNPKG

tdesign-vue-next

Version:
1 lines 21.9 kB
{"version":3,"file":"useVirtualScroll.mjs","sources":["../../../components/hooks/useVirtualScroll.ts"],"sourcesContent":["/* eslint-disable */\n/**\n * 当前虚拟滚动存在的问题\n * 1. 反复拖动滚动条,底部会出现奇怪的高度\n * 2. 表格高度发生变化时,底部也会出现奇怪的高度\n * 3. 无法直接定位滚动到某个元素,进而无法实现 Select 组件直接滚动到选中项\n */\nimport { ref, toRefs, reactive, onMounted, computed, watch, nextTick } from 'vue';\n\n// 虚拟滚动Hooks的完整实现,只所以封装成hooks,主要是为了方便跟其他组件搭配使用,比如说表格或者下拉框\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 // let revising = false; // 是否正在修正滚动条\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 // 计算虚拟滚动列表总高度,需要动态修正\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 // 修复只有一个元素时存在偏移的问题\n return visibleData.length === 1 ? 0 : state.cachedScrollY[firstRow.$index];\n }\n return 0;\n });\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 // 计算每行对应的scrollTop值\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; // 锚点元素scrollY= 容器滚动高度 - 锚点元素的offset\n state.cachedHeight[index] = anchorDomHeight;\n\n for (let i = index + 1; i <= state.visibleData[state.visibleData.length - 1]?.$index; i++) {\n // 计算锚点后面的元素scrollY\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]; // 当前元素的y 是前一个元素的y+前一个元素高度\n // state.cachedScrollY[i] = scrollY;\n state.cachedScrollY.splice(i, 1, scrollY); // 兼容vue2的composition api\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]; // 当前元素的y是下一个元素y - 当前元素高度\n // state.cachedScrollY[i] = scrollY;\n state.cachedScrollY.splice(i, 1, scrollY);\n }\n if (state.cachedScrollY[0] > 0) {\n // 修正滚动过快时,滚动到顶部时,滚动条多余的问题\n // revising = true;\n const distance = state.cachedScrollY[0]; // 第一个元素scrollY即为多出的量\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 // 修正拖动过快时,滚动到顶端时,滚动条不足的偏差\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 // setTimeout是为了保证快速拖动到底部时,以下逻辑能够正常执行\n const { scrollTop, scrollHeight, clientHeight } = container.value;\n if (scrollTop + clientHeight === scrollHeight) {\n // 滚动到底部时,修正底部有空余的问题\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 // 滚动时动态计算和渲染\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 // !disatance 可能为横向滚动,不做任何计算\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 // 滚动条到底了\n index = data.value.length - visibleCount + 1;\n // calculateScrollY();\n }\n if (start <= index - bufferSize) {\n // 计算第一个挂载元素\n start = Math.min(data.value.length - visibleCount, index - bufferSize);\n if (start < 0) {\n start = 0;\n }\n }\n } else {\n // 向上滚动\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 // 计算第一个挂载元素\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":["useVirtualScroll","data","_ref","container","_ref$fixedHeight","fixedHeight","_ref$lineHeight","lineHeight","_ref$bufferSize","bufferSize","_ref$threshold","threshold","state","reactive","visibleData","cachedHeight","cachedScrollY","isVirtual","computed","value","length","updateId","ref","trs","Map","visibleCount","beforeScrollTop","index","offset","start","last","reset","forEach","item","i","$index","scrollHeight","maxScrollY","reduce","sum","v","average","translateY","firstRow","updateVisibleData","Math","min","slice","calculateScrollY","_anchorDom$getBoundin","anchorDom","get","anchorDomHeight","getBoundingClientRect","height","scrollTop","_state$visibleData","tr","_ref2","scrollY","splice","_state$visibleData$","_ref3","distance","s","max","nextTick","_container$value","clientHeight","handleScroll","lastIndex","_container$value2","watch","flush","handleRowMounted","clear","mounted","refreshContainer","ceil","offsetHeight","onMounted","window","IntersectionObserver","ob","entries","entry","isIntersecting","intersectionRatio","unobserve","observe","_objectSpread","toRefs"],"mappings":"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"}