Skip to content

useVirtualList

长列表虚拟化列表的 Hook,用于解决展示海量数据渲染时首屏渲染缓慢和滚动卡顿问题。

使用

<template>
  <div class="hello">
    <button
      style="margin-top: 30px"
      type="button"
      @click="handleVirtualScrollTo"
    >
      scroll to
    </button>
    <div
      :ref="containerProps.ref"
      @scroll="containerProps.onScroll"
      style="height: 300px; overflow: auto;border: 1px solid #cccccc"
    >
      <div :style="wrapperStyle">
        <div
          v-for="active in list"
          :key="active"
          style="
            height: 59px;
            border-bottom: 1px solid #cccccc;
            background-color: white;
          "
        >
          {{ active }}
        </div>
      </div>
    </div>
  </div>
</template>

<script lang="ts">
import { useVirtualList } from "@dfsj/hooks";

export default {
  
  setup() {
    const { list, wrapperStyle, containerProps, scrollTo } = useVirtualList(
      Array.from(Array(99999).keys()),
      {
        itemHeight: 60,
        overscan: 10,
      }
    );

    const handleVirtualScrollTo = () => {
      scrollTo(22);
    };

    return {
      list,
      wrapperStyle,
      containerProps,
      handleVirtualScrollTo,
    };
  },
};
</script>

useVirtualList接受一个数组,导出一个虚拟化的list以元素配置,具体配置看Api

Api

Params

参数说明类型默认值
arr包含大量数据的列表T[][]
options可选配置项,见 OptionsOptions-

Options

参数说明类型默认值
itemHeight行高度,静态高度可以直接写入像素值,动态高度可传入函数number((index: number) => number)
overscan视区上、下额外展示的 dom 节点数量number5

Result

参数说明类型
list当前需要展示的列表内容T[]
containerProps滚动容器的 propsobject
wrapperStylechildren 外层包裹器 Styleobject
scrollTo快速滚动到指定 index(index: number) => void