{"version":3,"file":"virtual-list.vue2.mjs","sources":["../../../../../packages/components/data-table/src/virtual-list.vue"],"sourcesContent":["<template>\n  <ElScrollbar\n    ref=\"containerRef\"\n    @scroll=\"handleScroll\"\n    :style=\"{ height }\"\n    :view-style=\"listStyle\"\n  >\n    <component :is=\"tag\" v-bind=\"$attrs\" ref=\"wrapRef\">\n      <slot name=\"prepend\" />\n      <slot :list=\"renderedRange\" :style=\"itemStyle\" />\n      <slot name=\"append\" />\n    </component>\n  </ElScrollbar>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n  computed,\n  onMounted,\n  onUnmounted,\n  shallowRef,\n  watch,\n  type PropType\n} from 'vue'\nimport ElScrollbar from '@element-ultra/components/scrollbar'\nimport { useResizeObserver } from '@vueuse/core'\nimport { debounce } from 'lodash'\n\nconst props = defineProps({\n  /** 指定渲染的元素标签 */\n  tag: {\n    type: String,\n    default: 'div'\n  },\n\n  /** 容器高度 */\n  height: {\n    type: String\n  },\n\n  /** 所有数据 */\n  data: {\n    type: Array as PropType<any[]>,\n    default: () => []\n  },\n\n  /** 唯一标识key */\n  uniqueKey: {\n    type: String\n  },\n\n  /** 预渲染数量 */\n  prerender: {\n    type: Number,\n    default: 60\n  },\n\n  /** 缓冲区高度, 优化滚动性能 */\n  bufferHeight: {\n    type: Number,\n    default: 200\n  },\n\n  /** 尺寸大小 */\n  itemSize: {\n    type: Number,\n    default: 40\n  },\n\n  /** 优化滚动性能减少 */\n  idle: {\n    type: Boolean\n  }\n})\n\ntype ScrollCtx = {\n  scrollTop: number\n  scrollLeft: number\n  scrollHeight: number\n  scrollWidth: number\n}\n\nconst itemStyle = computed(() => {\n  return {\n    height: props.itemSize + 'px'\n  }\n})\n\nconst wrapRef = shallowRef<HTMLElement>()\n\nconst emit = defineEmits({\n  scroll: (s: ScrollCtx) => true\n})\n\n/** 总高度, 预估高度 */\nlet totalHeight = computed(() => {\n  return props.itemSize * props.data.length\n})\n\nconst listStyle = computed(() => {\n  return {\n    height: totalHeight.value + 'px',\n    display: 'inline-block'\n  }\n})\n\n/** 当前滚动的位置 */\nlet position = shallowRef(0)\n\n/** 容器高度 */\nlet containerHeight = 0\n\n/** 列表渲染范围 */\nconst renderedRange = computed(() => {\n  const { itemSize, bufferHeight, data } = props\n\n  /** 使用缓冲区对冲掉网上滚动时元素的渲染 */\n  let end = position.value + ~~((containerHeight + bufferHeight * 2) / itemSize)\n\n  return data.slice(position.value, end)\n})\n\nwatch(() => props.data, () => {\n  position.value = 0\n  containerRef.value?.scrollTo({ top: 0})\n})\n\nwatch(\n  [() => position.value, () => props.itemSize],\n  ([position, itemSize]) => {\n    if (!wrapRef.value) return\n\n    wrapRef.value.style.transform = `translateY(${position * itemSize}px)`\n  },\n  { immediate: true }\n)\n\nlet scroll = debounce((s: ScrollCtx) => {\n  position.value = ~~((s.scrollTop - props.bufferHeight) / props.itemSize)\n  position.value < 0 && (position.value = 0)\n}, 16.67)\n\n/** 正常滚动 */\nconst handleScroll = (s: ScrollCtx) => {\n  emit('scroll', s)\n  scroll(s)\n  // requestAnimationFrame(() => {\n  //   emit('scroll', s)\n  //   scroll(s)\n  // })\n}\nconst containerRef = shallowRef<InstanceType<typeof ElScrollbar>>()\n\nwatch(\n  () => props.itemSize,\n  () => {\n    if (!containerRef.value?.wrapRef) return\n    const { scrollHeight, scrollTop, scrollLeft, scrollWidth } =\n      containerRef.value?.wrapRef\n    scrollTop &&\n      handleScroll({\n        scrollTop,\n        scrollLeft,\n        scrollHeight,\n        scrollWidth\n      })\n  }\n)\n\nlet stop: () => void\nonMounted(() => {\n  stop = useResizeObserver(containerRef.value?.wrapRef, ([entry]) => {\n    const { height } = entry.contentRect\n    containerHeight = height\n  }).stop\n})\n\nonUnmounted(() => {\n  stop?.()\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n  inheritAttrs: false\n}\n</script>\n"],"names":["position"],"mappings":"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"}