vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 10.8 kB
Source Map (JSON)
{"version":3,"file":"virtual-list.cjs","sources":["../../../components/virtual-list/virtual-list.tsx"],"sourcesContent":["import { NativeScroll } from '@/components/native-scroll'\nimport { ResizeObserver } from '@/components/resize-observer'\n\nimport { computed, defineComponent, nextTick, ref, renderSlot, toRefs, watch } from 'vue'\n\nimport { emitEvent, useNameHelper, useProps } from '@vexip-ui/config'\nimport { createSlotRender, useVirtual } from '@vexip-ui/hooks'\nimport { virtualListProps } from './props'\n\nimport type { NativeScrollExposed } from '@/components/native-scroll'\nimport type { ScrollPayload } from './symbol'\n\nexport default defineComponent({\n name: 'VirtualList',\n components: {\n NativeScroll,\n ResizeObserver,\n },\n inheritAttrs: false,\n props: virtualListProps,\n emits: [],\n setup(_props, { slots, attrs, expose }) {\n const props = useProps('virtualList', _props, {\n items: {\n default: () => [],\n static: true,\n },\n itemSize: 36,\n itemFixed: false,\n idKey: 'id',\n defaultKeyAt: null,\n bufferSize: 5,\n listTag: 'div',\n itemsTag: 'ul',\n itemsAttrs: null,\n hideBar: false,\n lockItems: false,\n autoplay: false,\n ignoreResize: false,\n disabled: false,\n })\n\n const nh = useNameHelper('virtual-list')\n\n const { items, itemSize, itemFixed, idKey, bufferSize } = toRefs(props)\n\n const scroll = ref<NativeScrollExposed>()\n const list = ref<HTMLElement>()\n const wrapper = computed(() => scroll.value?.content)\n\n const {\n indexMap,\n heightTree,\n scrollOffset,\n visibleItems,\n listStyle,\n itemsStyle,\n handleScroll,\n handleResize,\n handleItemResize,\n scrollTo,\n scrollBy,\n scrollToKey,\n scrollToIndex,\n ensureIndexInView,\n ensureKeyInView,\n } = useVirtual({\n items,\n itemSize,\n itemFixed,\n idKey,\n bufferSize,\n wrapper,\n defaultKeyAt: props.defaultKeyAt,\n autoResize: false,\n })\n\n expose({\n scroll,\n wrapper,\n list,\n indexMap,\n heightTree,\n scrollOffset,\n scrollTo,\n scrollBy,\n scrollToKey,\n scrollToIndex,\n ensureIndexInView,\n ensureKeyInView,\n refresh,\n })\n\n watch(\n () => props.items.length,\n () => {\n nextTick(refresh)\n },\n )\n\n const className = computed(() => {\n return [\n nh.b(),\n props.inherit && nh.bm('inherit'),\n props.disabled && nh.bm('disabled'),\n attrs.class,\n ]\n })\n\n function onScroll(payload: ScrollPayload) {\n handleScroll()\n emitEvent(props.onScroll, payload)\n }\n\n function onResize(entry: ResizeObserverEntry) {\n if (props.ignoreResize) return\n\n handleResize(entry)\n emitEvent(props.onResize, entry)\n }\n\n function onItemResize(key: number | string | symbol, entry: ResizeObserverEntry) {\n if (!props.lockItems && !props.ignoreResize) {\n handleItemResize(key, entry)\n }\n }\n\n async function refresh() {\n await scroll.value?.refresh()\n handleScroll()\n }\n\n function renderList(items: Record<string, any>[]) {\n const keyField = props.idKey\n const itemFixed = props.itemFixed\n const keyIndexMap = indexMap.value\n const { class: itemsClass, style: itemsOtherStyle, ...itemsAttrs } = props.itemsAttrs || {}\n\n const ListTag = (props.listTag || 'div') as any\n const ItemsTag = (props.itemsTag || 'ul') as any\n\n return (\n <ResizeObserver onResize={refresh}>\n <ListTag ref={list} class={nh.be('list')} style={listStyle.value}>\n <ItemsTag\n {...itemsAttrs}\n class={[nh.be('items'), itemsClass]}\n style={[itemsStyle.value, itemsOtherStyle]}\n >\n {slots.default && props.items.length\n ? items.map(item => {\n const key = item[keyField]\n const index = keyIndexMap.get(key)\n const vnode = renderSlot(slots, 'default', { item, index })\n\n if (itemFixed) {\n vnode.key = key\n\n return vnode\n }\n\n const onResize = onItemResize.bind(null, key)\n\n return (\n <ResizeObserver key={key} onResize={onResize}>\n {() => vnode}\n </ResizeObserver>\n )\n })\n : renderSlot(slots, 'empty')}\n </ItemsTag>\n </ListTag>\n </ResizeObserver>\n )\n }\n\n return () => {\n let renderingItems = visibleItems.value\n\n if (import.meta.env.MODE === 'test') {\n // It is difficult to test ResizeObserver in vitest, so directly rendering all items\n renderingItems = props.items\n }\n\n return (\n <NativeScroll\n {...attrs}\n ref={scroll}\n class={className.value}\n inherit={props.inherit}\n use-y-bar={!props.hideBar}\n scroll-y={scrollOffset.value}\n autoplay={props.autoplay}\n onScroll={onScroll}\n onResize={onResize}\n >\n {{\n default: () => {\n if (props.disabled) {\n return slots.default && props.items.length\n ? props.items.map((item, index) => {\n const key = item[props.idKey]\n const vnode = renderSlot(slots, 'default', { item, index })\n\n vnode.key = key\n\n return vnode\n })\n : renderSlot(slots, 'empty')\n }\n\n return renderList(renderingItems)\n },\n prefixTrap: createSlotRender(slots, ['prefix-trap', 'prefixTrap']),\n suffixTrap: createSlotRender(slots, ['suffix-trap', 'suffixTrap']),\n }}\n </NativeScroll>\n )\n }\n },\n})\n"],"names":["defineComponent","name","components","NativeScroll","ResizeObserver","inheritAttrs","props","virtualListProps","emits","setup","_props","slots","attrs","expose","useProps","items","default","static","itemSize","itemFixed","idKey","defaultKeyAt","bufferSize","listTag","itemsTag","itemsAttrs","hideBar","lockItems","autoplay","ignoreResize","disabled","nh","useNameHelper","toRefs","scroll","ref","list","wrapper","computed","value","content","indexMap","heightTree","scrollOffset","visibleItems","listStyle","itemsStyle","handleScroll","handleResize","handleItemResize","scrollTo","scrollBy","scrollToKey","scrollToIndex","ensureIndexInView","ensureKeyInView","useVirtual","autoResize","refresh","watch","length","nextTick","className","b","inherit","bm","class","onScroll","payload","onResize","entry","onItemResize","key","renderList","keyField","keyIndexMap","itemsClass","style","itemsOtherStyle","ListTag","ItemsTag","_createVNode","be","_mergeProps","map","item","index","get","vnode","renderSlot","bind","renderingItems","prefixTrap","createSlotRender","suffixTrap"],"mappings":"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"}