{"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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"}