UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 6.45 kB
{"version":3,"file":"usePanelVirtualScroll.mjs","sources":["../../../src/select/hooks/usePanelVirtualScroll.ts"],"sourcesContent":["import { Ref, computed, onMounted, onBeforeUnmount } from 'vue';\nimport useVirtualScroll from '../../hooks/useVirtualScroll';\nimport { TdSelectProps } from '../type';\nimport { Styles } from '../../common';\n\nexport const usePanelVirtualScroll = (props: {\n scroll: TdSelectProps['scroll'];\n popupContentRef: Ref<HTMLElement>;\n options: Ref<TdSelectProps['options']>;\n}) => {\n const isVirtual = computed(\n () => props.scroll?.type === 'virtual' && props.options.value?.length > (props.scroll?.threshold || 100),\n );\n\n const {\n trs = null,\n visibleData = null,\n handleScroll: handleVirtualScroll = null,\n scrollHeight = null,\n translateY = null,\n handleRowMounted = null,\n } = props.scroll?.type === 'virtual'\n ? useVirtualScroll({\n container: props.popupContentRef,\n data: props.options,\n fixedHeight: props.scroll?.isFixedRowHeight || false,\n lineHeight: props.scroll?.rowHeight || 28, // 默认每行高度28\n bufferSize: props.scroll?.bufferSize || 20,\n threshold: props.scroll?.threshold || 100,\n })\n : {};\n let lastScrollY = -1;\n\n const onInnerVirtualScroll = (e: WheelEvent) => {\n if (!isVirtual.value) {\n return;\n }\n const target = e.target as HTMLElement;\n const top = target.scrollTop;\n // 排除横向滚动出发的纵向虚拟滚动计算\n if (Math.abs(lastScrollY - top) > 5) {\n handleVirtualScroll();\n lastScrollY = top;\n } else {\n lastScrollY = -1;\n }\n };\n\n // 监听popup滚动 处理虚拟滚动时的virtualData变化\n onMounted(() => {\n props.popupContentRef.value?.addEventListener('scroll', onInnerVirtualScroll);\n });\n\n // 卸载时取消监听\n onBeforeUnmount(() => {\n props.popupContentRef.value?.removeEventListener('scroll', onInnerVirtualScroll);\n });\n\n const cursorStyle = computed(\n () =>\n ({\n position: 'absolute',\n width: '1px',\n height: '1px',\n transition: 'transform 0.2s',\n transform: `translate(0, ${scrollHeight.value}px)`,\n '-ms-transform': `translate(0, ${scrollHeight.value}px)`,\n '-moz-transform': `translate(0, ${scrollHeight.value}px)`,\n '-webkit-transform': `translate(0, ${scrollHeight.value}px)`,\n } as Styles),\n );\n\n const panelStyle = computed(\n () =>\n ({\n transform: `translate(0, ${translateY.value}px)`,\n '-ms-transform': `translate(0, ${translateY.value}px)`,\n '-moz-transform': `translate(0, ${translateY.value}px)`,\n '-webkit-transform': `translate(0, ${translateY.value}px)`,\n } as Styles),\n );\n\n return {\n trs,\n scrollHeight,\n translateY,\n visibleData,\n handleRowMounted,\n isVirtual,\n cursorStyle,\n panelStyle,\n };\n};\n"],"names":["fixedHeight","lineHeight","bufferSize","threshold","trs","visibleData","handleVirtualScroll","scrollHeight","translateY","handleRowMounted","lastScrollY","onMounted","onBeforeUnmount","position","width","height","transition","transform","isVirtual","cursorStyle","panelStyle"],"mappings":"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"}