mealcomes
Version:
MealComes 用于学习前端的组件库
1 lines • 21 kB
Source Map (JSON)
{"version":3,"file":"virtual-scroll-list-otmacS0b.mjs","sources":["../../../../packages/components/virtual-scroll-list/src/props.ts","../../../../packages/components/virtual-scroll-list/src/virtual.ts","../../../../packages/components/virtual-scroll-list/src/virtual-item.tsx","../../../../packages/components/virtual-scroll-list/src/virtual-list.tsx","../../../../packages/components/virtual-scroll-list/index.ts"],"sourcesContent":["import type { DefineComponent, ExtractPropTypes, PropType } from 'vue';\n\n/**\n * 滚动方向 (向上 / 向下)\n */\nexport const virtualScrollDirection = ['front', 'behind'] as const;\n\nexport type VirtualScrollDirection = (typeof virtualScrollDirection)[number];\n\nexport type RangeOptions = {\n start: number;\n end: number;\n padFront: number;\n padBehind: number;\n};\n\nexport type VirtualOptions = {\n keeps: number;\n cache: number;\n estimatedRowHeight: number;\n uniqueIds: string[];\n};\n\nexport type UpdateType = (range: RangeOptions) => void;\n\nexport const virtualProps = {\n /**\n * 数据源\n */\n dataSource: {\n type: Array,\n required: true,\n default: () => []\n },\n /**\n * 每一项数据的 key\n */\n dataKey: {\n type: String,\n required: true\n },\n /**\n * 渲染多少条数据 (存在真实 dom)\n */\n keeps: {\n type: Number,\n default: 30\n },\n /**\n * 每一条数据预估高度\n */\n estimatedRowHeight: {\n type: Number,\n default: 80\n },\n /**\n * 每一行的数据组件\n */\n dataComponent: {\n type: [Object, Function] as PropType<\n DefineComponent<object, object, unknown>\n >,\n required: true\n },\n /**\n * 数据渲染缓冲区 (基于视口顶部 top 的数据所在位置, top ~ top + cache 为缓冲区)\n *\n * start = 10 cache = 5 end = 20\n * - 向下滚动时, 当 top 处于 10 ~ 15, 不做处理,\n * 当 top > 15, 将 start 赋为 15, 从而 end = 25(即往后渲染 cache 条数据)\n * - 向上滚动时, 当 top 处于 10 ~ 15, 不做处理,\n * 当 top < 10, 将 start 赋为 5, 从而 end = 15(即往前渲染 cache 条数据)\n */\n cache: {\n type: Number,\n default: 2\n }\n} as const;\n\nexport type VirtualProps = ExtractPropTypes<typeof virtualProps>;\n\nexport const virtualItemProps = {\n uniqueKey: {\n type: [String, Number] as PropType<string | number>,\n required: true\n },\n source: {\n type: Object,\n required: true\n },\n component: {\n type: [Object, Function] as PropType<\n DefineComponent<{ source: object }, object, unknown>\n >\n }\n} as const;\n\nexport type VirtualItemProps = ExtractPropTypes<typeof virtualItemProps>;\n\nexport const virtualItemEmits = {\n itemResize: (id: number | string, size: number) =>\n typeof size === 'number' &&\n (typeof id === 'number' || typeof id === 'string')\n};\n\nexport type VirtualItemEmits = ExtractPropTypes<typeof virtualItemEmits>;\n","import type {\n RangeOptions,\n UpdateType,\n VirtualOptions,\n VirtualScrollDirection\n} from './props';\n\n// 固定高度\n// 1. 上 padding 利用 开始范围前面的数据个数 * 每项高度\n// 2. 下 padding 利用 (总个数 - 当前显示到的个数) * 每项高度\n// 动态高度 (根据已经渲染出的数据先预估滚动条高度)\n// 1. 上 padding 根据当前 start 来累加 start 之前每一项的高度\n// 2. 下 padding 利用 (总个数 - 当前显示到的个数) * 预估高度\n// 当开始滚动时, 固定高度直接采用 偏移量 / 每项高度 计算数据在视口的起始位置\n// 动态高度则采用二分查找, 取已经加载的数据项的偏移量和当前偏移量最接近的那一项\n\nenum CALC_TYPE {\n /**\n * 初始高度\n */\n INIT = 'init',\n /**\n * 固定高度\n */\n FIXED = 'fixed',\n /**\n * 动态高度\n */\n DYNAMIC = 'dynamic'\n}\n\nexport function initVirtual(options: VirtualOptions, update: UpdateType) {\n const range: RangeOptions = {\n start: 0,\n end: 0,\n padBehind: 0,\n padFront: 0\n };\n /* 未滚动前的偏移量 */\n let offsetValue = 0;\n /* 每一项渲染过后的实际高度 */\n const sizes = new Map<string | number, number>();\n let calcType = CALC_TYPE.INIT;\n let fixedSizeVal = 0;\n /* 一开始时每一项的预估高度 */\n let firstRangeAvg: number;\n\n function isFixed() {\n return calcType === CALC_TYPE.FIXED;\n }\n\n function getEstimatedRowHeight() {\n return isFixed()\n ? fixedSizeVal\n : firstRangeAvg || options.estimatedRowHeight;\n }\n\n /**\n * 获取 index 处数据的偏移量\n */\n function getIndexOffset(idx: number) {\n if (!idx) return 0;\n let offset = 0;\n for (let i = 0; i < idx; i++) {\n const indexSize = sizes.get(options.uniqueIds[i]);\n offset +=\n typeof indexSize === 'number'\n ? indexSize\n : getEstimatedRowHeight();\n }\n return offset;\n }\n\n /**\n * 获取上 padding\n */\n function getPadFront() {\n if (isFixed()) {\n return getEstimatedRowHeight() * range.start;\n } else {\n return getIndexOffset(range.start);\n }\n }\n\n /**\n * 获取下 padding\n */\n function getPadBehind() {\n const lastIndex = options.uniqueIds.length - 1;\n return (lastIndex - range.end) * getEstimatedRowHeight();\n }\n\n /**\n * 更新范围\n */\n function updateRange(start: number, end: number) {\n range.start = start;\n range.end = end;\n range.padFront = getPadFront();\n range.padBehind = getPadBehind();\n update({ ...range });\n }\n\n /**\n * 范围检查\n */\n function checkRange(start: number, end: number) {\n const total = options.uniqueIds.length;\n const keeps = options.keeps;\n if (total < keeps) {\n start = 0;\n end = total - 1;\n } else if (end - start < keeps - 1) {\n start = end - keeps + 1;\n }\n updateRange(start, end);\n }\n\n /**\n * 获取滚动了多少条数据\n */\n function getScrollOvers() {\n if (isFixed()) {\n return Math.floor(offsetValue / getEstimatedRowHeight());\n } else {\n let l = 0;\n let r = options.uniqueIds.length;\n let mid = 0;\n let midOffset = 0;\n while (l < r) {\n mid = l + Math.floor((r - l) / 2);\n midOffset = getIndexOffset(mid);\n if (midOffset === offsetValue) {\n return mid;\n } else if (midOffset < offsetValue) {\n l = mid + 1;\n } else {\n r = mid - 1;\n }\n }\n return l > 0 ? --l : 0;\n }\n }\n\n function getEndByStart(start: number) {\n const computedEnd = start + options.keeps - 1;\n const end = Math.min(computedEnd, options.uniqueIds.length - 1);\n return end;\n }\n\n /**\n * 向上滚动 ( start 的更新 )\n */\n function handleFront() {\n const overs = getScrollOvers();\n if (overs > range.start) {\n // start = 10, end = 40, cache = 10\n // 但滚动到了15个, 此时无需更新 start (属于 start--cache 范围(缓冲区)内滚动)\n return;\n }\n const start = Math.max(0, overs - options.cache);\n checkRange(start, getEndByStart(start));\n }\n\n /**\n * 向下滚动\n */\n function handleBehind() {\n const overs = getScrollOvers();\n if (overs < range.start + options.cache) {\n return;\n }\n checkRange(overs, getEndByStart(overs));\n }\n\n function handleScroll(offset: number) {\n const direction: VirtualScrollDirection =\n offset < offsetValue ? 'front' : 'behind';\n offsetValue = offset;\n if (direction === 'front') {\n handleFront();\n } else if (direction === 'behind') {\n handleBehind();\n }\n }\n\n function saveSize(id: number | string, size: number) {\n sizes.set(id, size);\n\n // 第一条数据加载完后拿到其高度, 如果第二条数据高度与之不同, 则说明是动态高度\n // 否则说明是固定高度(即数据组件设置了 height), 此时便使用 estimatedRowHeight\n if (calcType === CALC_TYPE.INIT) {\n // 第一条数据渲染完后进入这里, 先设置为 fixed 高度\n fixedSizeVal = size;\n calcType = CALC_TYPE.FIXED;\n } else if (calcType === CALC_TYPE.FIXED && fixedSizeVal !== size) {\n // 第二条数据渲染完后如果高度和第一条数据不一样, 便会进入这里, 设置为 dynamic 高度\n calcType = CALC_TYPE.DYNAMIC;\n fixedSizeVal = 0;\n }\n\n // 如果是动态高度, 则根据已加载的数据高度算出平均值, 撑开滚动条\n if (calcType === CALC_TYPE.DYNAMIC) {\n // 判断条件保证只在初始的时候计算每一项的预估高度\n if (\n sizes.size < Math.min(options.keeps, options.uniqueIds.length)\n ) {\n firstRangeAvg = Math.round(\n [...sizes.values()].reduce((acc, val) => acc + val, 0) /\n sizes.size\n );\n }\n }\n }\n\n checkRange(0, options.keeps - 1);\n\n return {\n handleScroll,\n saveSize\n };\n}\n","import { defineComponent, onMounted, onUpdated, ref } from 'vue';\nimport { virtualItemEmits, virtualItemProps } from './props';\n\nexport default defineComponent({\n name: 'virtual-item',\n props: virtualItemProps,\n emits: virtualItemEmits,\n setup(props, { emit }) {\n const rootRef = ref<HTMLElement>();\n\n function dispatchEvent() {\n emit('itemResize', props.uniqueKey!, rootRef.value!.offsetHeight);\n }\n\n onMounted(() => {\n dispatchEvent();\n });\n\n onUpdated(() => {\n dispatchEvent();\n });\n\n return () => {\n const { component: Comp, source, uniqueKey } = props;\n return (\n Comp && (\n <div key={uniqueKey} ref={rootRef}>\n <Comp source={source}></Comp>\n </div>\n )\n );\n };\n }\n});\n","import { defineComponent, h, onBeforeMount, ref } from 'vue';\nimport { virtualProps } from './props';\nimport type { RangeOptions } from './props';\nimport { initVirtual } from './virtual';\nimport virtualItem from './virtual-item';\n\nexport default defineComponent({\n name: 'mc-virtual-scroll-list',\n props: virtualProps,\n setup(props) {\n const range = ref<RangeOptions | null>(null);\n let virtual: ReturnType<typeof initVirtual>;\n\n const getUniqueIdFromDataSource = (): string[] => {\n const { dataSource, dataKey } = props;\n return dataSource.map(\n item => (item as object)[dataKey as keyof typeof item]\n ) as string[];\n };\n\n const update = (newRange: RangeOptions) => {\n range.value = newRange;\n };\n\n const installVirtual = () => {\n virtual = initVirtual(\n {\n keeps: props.keeps,\n cache: props.cache || Math.round(props.keeps / 3),\n uniqueIds: getUniqueIdFromDataSource(),\n estimatedRowHeight: props.estimatedRowHeight\n },\n update\n );\n };\n\n onBeforeMount(() => {\n installVirtual();\n });\n\n function onItemResize(id: string | number, size: number) {\n virtual.saveSize(id, size);\n }\n\n function genRenderComponent() {\n const slots = [];\n const { start, end } = range.value!;\n const { dataSource, dataComponent, dataKey } = props;\n for (let index = start; index <= end; index++) {\n const data = dataSource[index];\n const key = (data as object)[dataKey as keyof typeof data];\n if (data) {\n slots.push(\n h(virtualItem, {\n uniqueKey: key,\n source: data,\n component: dataComponent,\n onItemResize: onItemResize\n })\n );\n }\n }\n return slots;\n }\n\n const rootRef = ref<HTMLElement>();\n function onScroll() {\n if (rootRef.value) {\n const offset = rootRef.value.scrollTop;\n virtual.handleScroll(offset);\n }\n }\n\n return () => {\n const { padFront, padBehind } = range.value!;\n const paddingStyle = {\n padding: `${padFront}px 0 ${padBehind}px`\n };\n\n return (\n <div\n onScroll={onScroll}\n ref={rootRef}\n style={{ overflowY: 'scroll' }}\n >\n <div style={paddingStyle}>{genRenderComponent()}</div>\n </div>\n );\n };\n }\n});\n","import { withInstall } from '@mealcomes/utils';\nimport _VirtualList from './src/virtual-list';\n\nexport const McVirtualScrollList = withInstall(_VirtualList);\n\nexport default McVirtualScrollList;\n\nexport type { VirtualProps } from './src/props';\n\ndeclare module 'vue' {\n export interface GlobalComponents {\n McVirtualScrollList: typeof McVirtualScrollList;\n }\n}\n"],"names":["virtualProps","virtualItemProps","virtualItemEmits","id","size","initVirtual","options","update","range","offsetValue","sizes","calcType","fixedSizeVal","firstRangeAvg","isFixed","getEstimatedRowHeight","getIndexOffset","idx","offset","i","indexSize","getPadFront","getPadBehind","updateRange","start","end","checkRange","total","keeps","getScrollOvers","l","r","mid","midOffset","getEndByStart","computedEnd","handleFront","overs","handleBehind","handleScroll","direction","saveSize","acc","val","virtualItem","name","props","emits","setup","emit","rootRef","ref","dispatchEvent","uniqueKey","value","offsetHeight","onMounted","onUpdated","component","Comp","source","_createVNode","_VirtualList","virtual","getUniqueIdFromDataSource","dataSource","dataKey","map","item","newRange","installVirtual","cache","Math","round","uniqueIds","estimatedRowHeight","onBeforeMount","onItemResize","genRenderComponent","slots","dataComponent","index","data","key","push","h","onScroll","scrollTop","padFront","padBehind","paddingStyle","padding","overflowY","McVirtualScrollList","withInstall"],"mappings":"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"}