tav-ui
Version:
1 lines • 8.93 kB
Source Map (JSON)
{"version":3,"file":"virtual-scroll2.mjs","sources":["../../../../../../../packages/components/virtual-scroll/src/virtual-scroll.tsx"],"sourcesContent":["import { computed, defineComponent, nextTick, onMounted, reactive, ref, unref, watch } from 'vue'\nimport { useEventListener } from '@tav-ui/hooks/event/useEventListener'\nimport { getSlot } from '@tav-ui/utils/helper/tsxHelper'\nimport { virtualScrollProps } from './types'\nimport type { Recordable } from './types'\nimport type { CSSProperties } from 'vue'\n\nconst prefixCls = 'ta-virtual-scroll'\n\nfunction convertToUnit(str: string | number | null | undefined, unit = 'px'): string | undefined {\n if (str == null || str === '') {\n return undefined\n } else if (isNaN(+str!)) {\n return String(str)\n } else {\n return `${Number(str)}${unit}`\n }\n}\n\nexport default defineComponent({\n name: 'TaVirtualScroll',\n props: virtualScrollProps,\n setup(props, { slots }) {\n const wrapElRef = ref<HTMLDivElement | null>(null)\n const state = reactive({\n first: 0,\n last: 0,\n scrollTop: 0,\n })\n\n const getBenchRef = computed(() => {\n return parseInt(props.bench as string, 10)\n })\n\n const getItemHeightRef = computed(() => {\n return parseInt(props.itemHeight as string, 10)\n })\n\n const getFirstToRenderRef = computed(() => {\n return Math.max(0, state.first - unref(getBenchRef))\n })\n\n const getLastToRenderRef = computed(() => {\n return Math.min((props.items || []).length, state.last + unref(getBenchRef))\n })\n\n const getContainerStyleRef = computed((): CSSProperties => {\n return {\n height: convertToUnit((props.items || []).length * unref(getItemHeightRef)),\n }\n })\n\n const getWrapStyleRef = computed((): CSSProperties => {\n const styles: Recordable<string> = {}\n const height = convertToUnit(props.height)\n const minHeight = convertToUnit(props.minHeight)\n const minWidth = convertToUnit(props.minWidth)\n const maxHeight = convertToUnit(props.maxHeight)\n const maxWidth = convertToUnit(props.maxWidth)\n const width = convertToUnit(props.width)\n\n if (height) styles.height = height\n if (minHeight) styles.minHeight = minHeight\n if (minWidth) styles.minWidth = minWidth\n if (maxHeight) styles.maxHeight = maxHeight\n if (maxWidth) styles.maxWidth = maxWidth\n if (width) styles.width = width\n return styles\n })\n\n watch([() => props.itemHeight, () => props.height], () => {\n onScroll()\n })\n\n function getLast(first: number): number {\n const wrapEl = unref(wrapElRef)\n if (!wrapEl) {\n return 0\n }\n const height = parseInt((props.height || 0).toString(), 10) || wrapEl.clientHeight\n\n return first + Math.ceil(height / unref(getItemHeightRef))\n }\n\n function getFirst(): number {\n return Math.floor(state.scrollTop / unref(getItemHeightRef))\n }\n\n function onScroll() {\n const wrapEl = unref(wrapElRef)\n if (!wrapEl) {\n return\n }\n state.scrollTop = wrapEl.scrollTop\n state.first = getFirst()\n state.last = getLast(state.first)\n }\n\n function renderChildren() {\n const { items = [] } = props\n return items.slice(unref(getFirstToRenderRef), unref(getLastToRenderRef)).map(genChild)\n }\n\n function genChild(item: any, index: number) {\n index += unref(getFirstToRenderRef)\n const top = convertToUnit(index * unref(getItemHeightRef))\n return (\n <div class={`${prefixCls}__item`} style={{ top }} key={index}>\n {getSlot(slots, 'default', { index, item })}\n </div>\n )\n }\n\n onMounted(() => {\n state.last = getLast(0)\n nextTick(() => {\n const wrapEl = unref(wrapElRef)\n if (!wrapEl) {\n return\n }\n useEventListener({\n el: wrapEl,\n name: 'scroll',\n listener: onScroll,\n wait: 0,\n })\n })\n })\n\n return () => (\n <div class={prefixCls} style={unref(getWrapStyleRef)} ref={wrapElRef}>\n <div class={`${prefixCls}__container`} style={unref(getContainerStyleRef)}>\n {renderChildren()}\n </div>\n </div>\n )\n },\n})\n"],"names":["prefixCls","convertToUnit","str","isNaN","String","name","props","virtualScrollProps","slots","wrapElRef","state","reactive","first","last","scrollTop","getBenchRef","parseInt","bench","getItemHeightRef","computed","getFirstToRenderRef","Math","max","unref","getLastToRenderRef","height","items","styles","minHeight","minWidth","maxHeight","maxWidth","width","watch","itemHeight","onScroll","getLast","toString","wrapEl","clientHeight","ceil","getFirst","genChild","index","top","item","onMounted","nextTick","useEventListener","el","listener","wait"],"mappings":";;;;;AAOA,MAAMA,SAAS,GAAG,mBAAlB,CAAA;;AAEA,EAAA,IAAA,GAASC,eAAcC,KAA6C,EAAA,EAAA;AAClE,IAAA,OAAW,KAAA,CAAP;AACF,GAAA,MAAA,IAAA,KAAA,CAAA,CAAA,GAAA,CAAA,EAAA;AACD,WAAUC,MAAAA,CAAK,GAAED,CAAAA,CAAF;SACPE;AACR,IAAM,OAAA,CAAA,EAAA,MAAA,CAAA,GAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AACL,GAAA;AACD,CAAA;AACF,oBAAA,eAAA,CAAA;;AAED,EAAA,KAAA,EAAA;AACEC,EAAAA,MAAM,KADuB,EAAA;AAE7BC,IAAAA,KAAOC;;IACF,eAAQ,GAAA,GAAA,CAAA,IAAA,CAAA,CAAA;AAAEC,IAAAA,MAAAA,KAAAA,GAAAA,QAAAA,CAAAA;AAAF,MAAW,KAAA,EAAA,CAAA;AACtB,MAAA,IAAMC,EAAS,CAAA;MACTC,SAAK,EAAGC,CAAAA;AACZC,KAAAA,CAAAA,CAAAA;AACAC,IAAAA,MAAI,WAFiB,GAAA,QAAA,CAAA,MAAA;AAGrBC,MAAAA,OAAAA,QAAW,CAAA,KAAA,CAAA,KAAA,EAAA,EAAA,CAAA,CAAA;AAHU,KAAD,CAAtB,CAAA;AAMA,IAAA,MAAMC,gBAAsB,GAAA,QAAO,CAAA,MAAA;AACjC,MAAA,OAAOC,QAAQ,CAACV,KAAK,CAACW,UAAtB,EAAA,EAAA,CAAA,CAAA;AACD,KAF2B,CAA5B,CAAA;AAIA,IAAA,MAAMC,mBAAmBC,GAAQ,QAAO,CAAA,MAAA;AACtC,MAAA,OAAOH,QAAQ,CAACV,CAAAA,EAAAA,KAAD,CAAA,KAAA,GAAA,KAAf,CAAA,WAAA,CAAA,CAAA,CAAA;AACD,KAFgC,CAAjC,CAAA;AAIA,IAAA,MAAMc,kBAAmB,GAAA,QAAW,CAAA,MAAO;AACzC,MAAA,OAAOC,IAAI,CAACC,GAAL,CAAS,CAAT,KAAYZ,CAAAA,KAAME,IAAQW,EAAAA,EAAAA,MAAMR,EAAAA,KAAAA,CAAD,IAAtC,GAAA,KAAA,CAAA,WAAA,CAAA,CAAA,CAAA;AACD,KAFmC,CAApC,CAAA;AAIA,IAAA,MAAMS,oBAAkB,GAAW,QAAO,CAAA,MAAA;MACxC,OAAOH;AACR,QAFD,MAAA,EAAA,aAAA,CAAA,CAAA,KAAA,CAAA,KAAA,IAAA,EAAA,EAAA,MAAA,GAAA,KAAA,CAAA,gBAAA,CAAA,CAAA;AAIA,OAAA,CAAA;MACE,CAAO;AACLI,IAAAA,MAAAA,eAAQxB,GAAAA,QAAoB,CAACyB,MAAS;MADjC,MAAP,MAAA,GAAA,EAAA,CAAA;AAGD,MAJD,MAAA,MAAA,GAAA,aAAA,CAAA,KAAA,CAAA,MAAA,CAAA,CAAA;AAMA,MAAA,MAAqB,SAAA,GAAA,aAAY,CAAqB,KAAA,CAAA,SAAA,CAAA,CAAA;MACpD,MAAMC,WAAN,aAAA,CAAA,KAAA,CAAA,QAAA,CAAA,CAAA;AACA,MAAA,MAAMF,SAASxB,GAAAA,aAAmB,CAAA,eAAlC,CAAA,CAAA;AACA,MAAA,MAAM2B,WAAY3B,aAAAA,CAAa,KAAM,CAAA,UAAN;AAC/B,MAAA,MAAM4B,QAAQ,aAAG5B,CAAAA,KAAmB,CAAA;AACpC,MAAA,IAAA;AACA,QAAA,aAAiBA,GAAAA,MAAAA,CAAAA;AACjB,MAAA,IAAA,SAAcA;AAEd,QAAA,gBAAkB,GAACwB,SAAP,CAAA;AACZ,MAAA,IAAIG;AACJ,QAAA,eAAcD,GAAM,QAACE,CAAP;AACd,MAAA,IAAIC,SAAJ;AACA,QAAA,gBAAcH,GAAOI;AACrB,MAAA,IAAIC,QAAOL;AACX,QAAA,MAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AACD,MAhBD,IAAA,KAAA;AAkBAM,QAAAA,MAAa3B,CAAAA,KAAAA,GAAM4B,KAAAA,CAAAA;MACjBC,OAAQ,MAAA,CAAA;AACT,KAFI,CAAL,CAAA;;MAISC,QAAAA,EAAAA,CAAAA;AACP,KAAA,CAAA,CAAA;;MACA,YAAa,GAAA,KAAA,CAAA,SAAA,CAAA,CAAA;AACX,MAAA,IAAA,CAAA,MAAA,EAAA;AACD,QAAA,OAAA,CAAA,CAAA;;AACD,MAAA,MAAMX,MAAM,GAAGT,QAAQ,CAAC,CAACV,KAAK,CAACmB,MAAN,IAAgB,CAAjB,EAAoBY,QAApB,EAAD,EAAiC,EAAjC,CAAR,IAAgDC,MAAM,CAACC,YAAtE,CAAA;AAEA,MAAA,OAAO3B,KAAK,GAAGS,IAAI,CAACmB,IAAL,CAAUf,MAAM,GAAGF,KAAK,CAACL,gBAAD,CAAxB,CAAf,CAAA;AACD,KAAA;;AAED,MAAA,OAASuB,UAAmB,CAAA,KAAA,CAAA,SAAA,GAAA,KAAA,CAAA,gBAAA,CAAA,CAAA,CAAA;AAC1B,KAAA;AACD,IAAA,SAAA,QAAA,GAAA;;AAED,MAAA,IAAA,CAAA;AACE,QAAA,OAAY;;MACZ,KAAKH,UAAQ,GAAA,MAAA,CAAA,SAAA,CAAA;AACX,MAAA,KAAA,CAAA,KAAA,GAAA,QAAA,EAAA,CAAA;AACD,MAAA,KAAA,CAAA,IAAA,GAAA,OAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA;;AACD5B,IAAAA,SAAMI,cAAYwB,GAAM;AACxB5B,MAAAA,MAAME;QACD,QAAL,EAAawB;AACd,OAAA,GAAA,KAAA,CAAA;;AAED,KAAA;aACQ,QAAA,CAAA,IAAA,EAAA,KAAA,EAAA;AAAEV,MAAAA,KAAAA,IAAQ,KAAA,CAAA,mBAAA,CAAA,CAAA;AAAV,MAAA,MAAN,GAAA,GAAA,aAAA,CAAA,KAAA,GAAA,KAAA,CAAA,gBAAA,CAAA,CAAA,CAAA;AACA,MAAA,OAAOA,WAAYH,CAAAA,KAAMH,EAAD;AACzB,QAAA,OAAA,EAAA,CAAA,EAAA,SAAA,CAAA,MAAA,CAAA;;AAED,UAAA,GAASsB;AACPC,SAAAA;QACMC,KAAAA,EAAG,KAAG3C;AACZ,OAAA,EAAA,CAAA,OAAA,CAAA,KAAA,EAAA,SAAA,EAAA;QAAA,KACe;QADf,IAC2C;AAAE2C,OAAAA,CAAAA,CAAAA,CAAAA,CAAAA;;aAAYD,CAAAA,MAAAA;AADzD,MAAA,KAEY,CAAA,IAAA,GAAA;cAAmB,CAAA,MAAA;AAASE,QAAAA,MAAAA,MAAAA,GAAAA,KAAAA,CAAAA,SAAAA,CAAAA,CAAAA;AAAT,QAF/B,IAAA,CAAA,MAAA,EAAA;AAKD,UAAA,OAAA;;AAEDC,QAAAA,gBAAgB,CAAA;AACdpC,UAAAA,EAAMG,EAAN,MAAoB;AACpBkC,UAAAA,IAAQ,EAAO,QAAA;AACb,UAAA,QAAY,EAAA,QAAQ;;SAChB,CAAA,CAAA;AACF,OAAA,CAAA,CAAA;AACD,KAAA,CAAA,CAAA;;AACDC,MAAAA,OAAAA,EAAAA,SAAgB;AACdC,MAAAA,SADe,KAAA,CAAA,eAAA,CAAA;AAEf5C,MAAAA,KAAAA,EAAAA,SAFe;AAGf6C,KAAAA,EAAAA,CAAAA,WAAUf,CAHK,KAAA,EAAA;AAIfgB,MAAAA,OAAAA,EAAM,CAAA,EAAA,SAAA,CAAA,WAAA,CAAA;AAJS,MAAA,OAAjB,EAAA,KAAA,CAAA,oBAAA,CAAA;AAMD,KAAA,EAXO,CAAR,cAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAYD,GAAA;;;;;"}