xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 11.7 kB
Source Map (JSON)
{"version":3,"file":"useVirtualScrollNew.mjs","sources":["../../src/hooks/useVirtualScrollNew.ts"],"sourcesContent":["import { ref, computed, watch, Ref } from 'vue';\nimport { TScroll } from '../common';\nimport useResizeObserver from './useResizeObserver';\n\nexport type UseVirtualScrollParams = Ref<{\n data: { [key: string]: any }[];\n scroll: TScroll;\n}>;\n\nexport interface ScrollToElementParams {\n index: number;\n top?: number;\n time?: number;\n behavior?: 'auto' | 'smooth';\n}\n\nconst useVirtualScroll = (container: Ref<HTMLElement>, params: UseVirtualScrollParams) => {\n const visibleData = ref<any[]>([]);\n const translateY = ref((params.value.data?.length || 0) * (params.value.scroll?.rowHeight || 50));\n const scrollHeight = ref(0);\n const trScrollTopHeightList = ref<number[]>([]);\n const trHeightList = ref<number[]>([]);\n const containerHeight = ref(0);\n const containerWidth = ref(0);\n const startAndEndIndex = ref<[number, number]>([0, 15]);\n\n const tScroll = computed(() => {\n const { scroll } = params.value;\n if (!scroll) return {};\n return {\n bufferSize: scroll.bufferSize || 10,\n isFixedRowHeight: scroll.isFixedRowHeight ?? false,\n rowHeight: scroll.rowHeight || 47,\n threshold: scroll.threshold || 100,\n type: scroll.type,\n };\n });\n\n const isVirtualScroll = computed(() => {\n const { data } = params.value;\n return tScroll.value.type === 'virtual' && tScroll.value.threshold < data.length;\n });\n\n const getTrScrollTopHeightList = (trHeightList: number[], containerHeight: number) => {\n const list: number[] = [];\n const { data } = params.value;\n for (let i = 0, len = data.length; i < len; i++) {\n list[i] = (list[i - 1] || containerHeight) + (trHeightList[i] || tScroll.value.rowHeight);\n }\n return list;\n };\n\n const tripleBufferSize = computed(() => tScroll.value.bufferSize * 3);\n\n const updateVisibleData = (trScrollTopHeightList: number[], scrollTop: number) => {\n let currentIndex = -1;\n for (let i = 0, len = trScrollTopHeightList.length; i < len; i++) {\n if (trScrollTopHeightList[i] > scrollTop) {\n currentIndex = i;\n break;\n }\n }\n if (currentIndex < 0) return;\n const startIndex = Math.min(currentIndex, trScrollTopHeightList.length - tripleBufferSize.value);\n const endIndex = startIndex + tripleBufferSize.value;\n if (startAndEndIndex.value.join() !== [startIndex, endIndex].join() && startIndex >= 0) {\n visibleData.value = params.value.data.slice(startIndex, endIndex);\n const lastScrollTop = trScrollTopHeightList[startIndex - 1];\n const top = lastScrollTop > 0 ? lastScrollTop - containerHeight.value : 0;\n translateY.value = top;\n startAndEndIndex.value = [startIndex, endIndex];\n }\n };\n\n const handleRowMounted = (rowData: any) => {\n if (!isVirtualScroll.value || !rowData || tScroll.value.isFixedRowHeight || !container.value) return;\n const trHeight = rowData.ref.value?.getBoundingClientRect().height;\n const rowIndex = rowData.data.__VIRTUAL_SCROLL_INDEX;\n const newTrHeightList = trHeightList.value;\n if (newTrHeightList[rowIndex] !== trHeight) {\n newTrHeightList[rowIndex] = trHeight;\n const scrollTopHeightList = getTrScrollTopHeightList(newTrHeightList, containerHeight.value);\n trScrollTopHeightList.value = scrollTopHeightList;\n\n const lastIndex = scrollTopHeightList.length - 1;\n scrollHeight.value = scrollTopHeightList[lastIndex] - containerHeight.value;\n updateVisibleData(scrollTopHeightList, container.value.scrollTop);\n }\n };\n\n const handleScroll = () => {\n if (!isVirtualScroll.value) return;\n updateVisibleData(trScrollTopHeightList.value, container.value.scrollTop);\n };\n\n const refreshVirtualScroll = ([{ contentRect }]: [ResizeObserverEntry]) => {\n const maxScrollbarWidth = 16;\n if (Math.abs(contentRect.width - containerWidth.value) > maxScrollbarWidth) {\n container.value.scrollTop = 0;\n translateY.value = 0;\n }\n containerWidth.value = contentRect.width;\n containerHeight.value = contentRect.height;\n };\n\n const addIndexToData = (data: any[]) => {\n data.forEach((item, index) => {\n // eslint-disable-next-line\n item['__VIRTUAL_SCROLL_INDEX'] = index;\n });\n };\n\n const updateScrollTop = ({ index, top = 0, behavior }: ScrollToElementParams) => {\n const scrollTop = trScrollTopHeightList.value[index] - containerHeight.value - top;\n container.value.scrollTo({\n top: scrollTop,\n behavior: behavior || 'auto',\n });\n };\n\n const scrollToElement = (p: ScrollToElementParams) => {\n updateScrollTop(p);\n // 不同行高的表格需要异步计算\n if (!tScroll.value.isFixedRowHeight) {\n const duration = p.time ?? 60;\n const timer = setTimeout(() => {\n updateScrollTop(p);\n clearTimeout(timer);\n }, duration);\n }\n };\n\n useResizeObserver(isVirtualScroll.value ? container : undefined, refreshVirtualScroll);\n\n watch(\n () => [[...params.value.data, tScroll, isVirtualScroll, container]],\n () => {\n if (!isVirtualScroll.value) return;\n const { data } = params.value;\n addIndexToData(data);\n const startIndex = startAndEndIndex.value[0];\n visibleData.value = data.slice(startIndex, startIndex + tripleBufferSize.value);\n\n // get container dom after one tick\n const timer = setTimeout(() => {\n if (container.value) {\n containerHeight.value = container.value.getBoundingClientRect().height;\n const scrollTopHeightList = getTrScrollTopHeightList(trHeightList.value || [], containerHeight.value);\n trScrollTopHeightList.value = scrollTopHeightList;\n }\n clearTimeout(timer);\n }, 0);\n },\n { immediate: true },\n );\n\n return {\n visibleData,\n translateY,\n scrollHeight,\n isVirtualScroll,\n handleScroll,\n handleRowMounted,\n scrollToElement,\n };\n};\n\nexport type VirtualScrollConfig = ReturnType<typeof useVirtualScroll>;\n\nexport default useVirtualScroll;\n"],"names":["bufferSize","rowHeight","threshold","trScrollTopHeightList","currentIndex","visibleData","startAndEndIndex","newTrHeightList","container","containerWidth","containerHeight","data","item","top","watch","immediate","translateY","scrollHeight","isVirtualScroll","handleScroll","handleRowMounted","scrollToElement"],"mappings":"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"}