{"version":3,"file":"useVirtualScroll.mjs","sources":["../../src/hooks/useVirtualScroll.ts"],"sourcesContent":["import { ref, toRefs, reactive, onMounted, computed, watch, nextTick } from 'vue';\n\nconst useVirtualScroll = ({\n  data,\n  container,\n  fixedHeight = false,\n  lineHeight = 30,\n  bufferSize = 20,\n  threshold = 100,\n}: {\n  data: any;\n  container: any;\n  fixedHeight: boolean;\n  lineHeight: number;\n  bufferSize: number;\n  threshold: number;\n}) => {\n  const state = reactive({\n    visibleData: [],\n    cachedHeight: [],\n    cachedScrollY: [],\n  });\n  const isVirtual = computed(() => data.value.length > threshold);\n  const updateId = ref(0);\n  const trs = new Map();\n\n  let visibleCount = 0;\n  let beforeScrollTop = 0;\n  let index = 0;\n  let offset = 0;\n  let start = 0;\n  let last = 0;\n\n  const reset = () => {\n    data.value.forEach((item: any, i: number) => {\n      item.$index = i;\n      if (fixedHeight) {\n        state.cachedScrollY[i] = i * lineHeight;\n      }\n    });\n    if (!fixedHeight) {\n      state.cachedScrollY[data.value.length - 1] = undefined; // 初始化cachedScrollY数组的长度\n    }\n  };\n  reset();\n\n  const scrollHeight = computed(() => {\n    const { cachedHeight } = state;\n    const { length } = cachedHeight;\n    if (length) {\n      const maxScrollY = cachedHeight.reduce((sum, v) => sum + v || lineHeight, 0); // 当前总高度\n      if (cachedHeight.length === data.value.length) {\n        return maxScrollY;\n      }\n      const average = maxScrollY / cachedHeight.length; // 平均高度\n      return maxScrollY + (data.value.length - cachedHeight.length) * average; // 预估总高度\n    }\n    return isVirtual.value ? data.value.length * lineHeight : 0;\n  });\n  const translateY = computed(() => {\n    const { visibleData } = state;\n    const firstRow = visibleData[0];\n    if (firstRow) {\n      return visibleData.length === 1 ? 0 : state.cachedScrollY[firstRow.$index];\n    }\n    return 0;\n  });\n\n  const updateVisibleData = () => {\n    last = Math.min(start + visibleCount + bufferSize * 2, data.value.length);\n    state.visibleData = data.value.slice(start, last);\n  };\n  const calculateScrollY = () => {\n    const anchorDom = trs.get(index);\n    if (!anchorDom) {\n      return; \n    }\n    const anchorDomHeight = anchorDom?.getBoundingClientRect()?.height; \n    state.cachedScrollY[index] = container.value.scrollTop - offset; \n    state.cachedHeight[index] = anchorDomHeight;\n\n    for (let i = index + 1; i <= state.visibleData[state.visibleData.length - 1]?.$index; i++) {\n      const tr = trs.get(i);\n      const { height } = tr?.getBoundingClientRect() || {};\n      state.cachedHeight[i] = height;\n      const scrollY = state.cachedScrollY[i - 1] + state.cachedHeight[i - 1]; \n      // state.cachedScrollY[i] = scrollY;\n      state.cachedScrollY.splice(i, 1, scrollY); \n    }\n\n    for (let i = index - 1; i >= state.visibleData[0]?.$index; i--) {\n      const tr = trs.get(i);\n      const { height } = tr?.getBoundingClientRect() || {};\n      state.cachedHeight[i] = height;\n      const scrollY = state.cachedScrollY[i + 1] - state.cachedHeight[i]; \n      // state.cachedScrollY[i] = scrollY;\n      state.cachedScrollY.splice(i, 1, scrollY);\n    }\n    if (state.cachedScrollY[0] > 0) {\n      // revising = true;\n      const distance = state.cachedScrollY[0]; \n      const length = Math.min(last, data.value.length);\n      for (let i = 0; i < length; i++) {\n        // state.cachedScrollY[i] -= distance;\n        state.cachedScrollY.splice(i, 1, state.cachedScrollY[i] - distance);\n      }\n\n      const scrollTop = state.cachedScrollY[index - 1] ? state.cachedScrollY[index - 1] + offset : offset;\n      container.value.scrollTop = scrollTop;\n      beforeScrollTop = scrollTop;\n      // revising = false;\n    }\n    if (state.cachedScrollY[start] < 0) {\n      // revising = true;\n      const s = state.cachedHeight.slice(0, Math.max(0, index)).reduce((sum, v) => sum + v, 0) + offset;\n      container.value.scrollTop = s;\n      beforeScrollTop = s;\n      if (s === 0) {\n        index = 0;\n        offset = 0;\n      }\n      // revising = false;\n    }\n    nextTick(() => {\n      const { scrollTop, scrollHeight, clientHeight } = container.value;\n      if (scrollTop + clientHeight === scrollHeight) {\n        // revising = true;\n        for (let i = last - 1; i >= start; i--) {\n          if (i === last - 1) {\n            // state.cachedScrollY[i] = scrollHeight.value - state.cachedHeight[i];\n            state.cachedScrollY.splice(i, 1, scrollHeight.value - state.cachedHeight[i]);\n          } else {\n            // state.cachedScrollY[i] = state.cachedScrollY[i + 1] - state.cachedHeight[i];\n            state.cachedScrollY.splice(i, 1, state.cachedScrollY[i + 1] - state.cachedHeight[i]);\n          }\n        }\n        // revising = false;\n      }\n    });\n  };\n\n  const handleScroll = () => {\n    if (!isVirtual.value) return;\n    // if (revising) {\n    //   return false;\n    // }\n    const { scrollTop } = container.value;\n    let distance = scrollTop - beforeScrollTop; \n    beforeScrollTop = scrollTop;\n    distance += offset;\n    let lastIndex = index;\n    if (!distance) return;\n    if (distance >= 0) {\n      // 向下滚动\n      while (lastIndex < data.value.length && distance > (state.cachedHeight[lastIndex] || lineHeight)) {\n        if (!state.cachedHeight[lastIndex]) {\n          state.cachedHeight[lastIndex] = lineHeight;\n        }\n        distance -= state.cachedHeight[lastIndex];\n        lastIndex++;\n      }\n      if (lastIndex >= data.value.length) {\n        index = data.value.length - 1;\n        offset = 0;\n      } else {\n        index = lastIndex;\n        offset = distance;\n      }\n      const { clientHeight, scrollHeight } = container.value;\n      if (scrollTop + clientHeight === scrollHeight) {\n        index = data.value.length - visibleCount + 1;\n        // calculateScrollY();\n      }\n      if (start <= index - bufferSize) {\n        start = Math.min(data.value.length - visibleCount, index - bufferSize);\n        if (start < 0) {\n          start = 0;\n        }\n      }\n    } else {\n      while (distance < 0) {\n        lastIndex--;\n        if (!state.cachedHeight[lastIndex]) {\n          state.cachedHeight[lastIndex] = lineHeight;\n        }\n        distance += state.cachedHeight[lastIndex];\n      }\n      if (lastIndex < 0) {\n        index = 0;\n        offset = 0;\n      } else {\n        index = lastIndex;\n        offset = distance;\n      }\n      calculateScrollY();\n      if (start > index - bufferSize) {\n        start = Math.max(0, index - bufferSize);\n      }\n    }\n    updateVisibleData();\n  };\n\n  !fixedHeight && watch(updateId, calculateScrollY, { flush: 'post' });\n  const handleRowMounted = () => {\n    if (!isVirtual.value) return;\n    updateId.value++;\n  };\n  watch(data, () => {\n    reset();\n    state.visibleData = [];\n    state.cachedScrollY = [];\n    state.cachedHeight = [];\n    beforeScrollTop = 0;\n    index = 0;\n    offset = 0;\n    start = 0;\n    // revising = false;\n    trs.clear();\n    if (data.value.length <= threshold) {\n      state.visibleData = data.value;\n    } else {\n      updateVisibleData();\n    }\n\n    container.value && (container.value.scrollTop = 0);\n  });\n  let mounted = false;\n  const refreshContainer = () => {\n    if (mounted) {\n      visibleCount = Math.ceil(container.value.offsetHeight / lineHeight);\n      updateVisibleData();\n    }\n  };\n  onMounted(() => {\n    if (!window || !window.IntersectionObserver) {\n      return;\n    }\n    const ob = new window.IntersectionObserver((entries) => {\n      const entry = entries[0];\n      if (entry.isIntersecting || entry.intersectionRatio) {\n        mounted = true;\n        isVirtual.value && refreshContainer();\n        ob.unobserve(container.value);\n      }\n    });\n    container.value && ob.observe(container.value);\n  });\n  return {\n    trs,\n    scrollHeight,\n    ...toRefs(state),\n    translateY,\n    handleScroll,\n    handleRowMounted,\n    refreshContainer,\n    fixedHeight,\n    calculateScrollY,\n  };\n};\nexport default useVirtualScroll;\n"],"names":["fixedHeight","lineHeight","bufferSize","threshold","visibleData","cachedHeight","cachedScrollY","state","reset","last","container","beforeScrollTop","index","offset","nextTick","distance","lastIndex","start","calculateScrollY","updateVisibleData","flush","visibleCount","onMounted","mounted","isVirtual","ob","trs","scrollHeight","translateY","handleScroll","handleRowMounted","refreshContainer"],"mappings":"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"}