vue3实现虚拟列表

1.需要确定展示的数据 这里自动生成1000条数据

       //需要渲染的数据
          let arrs = Array(1000)
            .fill("")
            .map((item, index) => ({
              id: index,
              content: `第${index + 1}条数据`,
            }));

2.需要 展示的起始下标,结束下标 和每次渲染的节点数、单条数据的高度 并获取列表的dom

       //需要展示单条数据的高度
          let size = 60;
          //需要展示的起始下标
          let start = ref(0);
          // 需要展示数据的结束下标
          let end = ref(10);
          //每次渲染的节点个数
          let shownum = 10;
          //获取列表dom
          let container = ref(null);

3.分别计算出需要展示出来的数据、容器的高度、列表滚动的top值

       //需要展示出来的数据
          let showData = computed(() => {
            return arrs.slice(start.value, end.value);
          });
          //容器的高度
          let containerHeigth = computed(() => {
            return size * shownum + "px";
          });
          //撑开容器内容高度的元素高度
          let barHeigth = computed(() => {
            return size * arrs.length + "px";
          });
          //列表项上滚动该表top值
          let listTop = computed(() => {
            return start.value * size + "px";
          });

4.滚动事件

       function handleScroll() {
            //获取容器顶部滚动条的尺寸
            const scrollTop = container.value.scrollTop;
            //计算卷曲的数据条数,用计算的结果作为获取数据的起始和结束下标
            //起始的下标就是卷去的数据条数,向下取整
            start.value = Math.floor(scrollTop / size);
            //结束下标就是起始下标加上需要展示的数据条数
            end.value = start.value + shownum;
          }

5.全部代码展示

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
    .container {
      overflow-y: scroll;
      background-color: rgba(150, 150, 150, 0.5);
      font-size: 20px;
      font-weight: bold;
      line-height: 60px;
      width: 500px;
      margin: 0 auto;
      position: relative;
      text-align: center;
    }
    .list {
      position: absolute;
      top: 0;
      width: 100%;
    }
  </style>
  <body>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

    <div id="app">
      <div
        class="container"
        :style="{height:containerHeigth}"
        @scroll="handleScroll"
        ref="container"
      >
        <!-- 数据列表 -->
        <div class="list" :style="{top:listTop}">
          <!-- 列表项 -->
          <div
            v-for="item in showData"
            :key="item.id"
            :style="{height:size+'px'}"
          >
            {{item.content}}
          </div>
          <!-- 用于撑开高度的元素 -->
          <div class="bar" :style="{height:barHeigth}"></div>
        </div>
      </div>
    </div>

    <script>
      const { createApp, ref, computed } = Vue;

      createApp({
        setup() {
          //需要展示单条数据的高度
          let size = 60;
          //需要展示的起始下标
          let start = ref(0);
          // 需要展示数据的结束下标
          let end = ref(10);
          //每次渲染的节点个数
          let shownum = 10;
          //获取列表dom
          let container = ref(null);

          //需要渲染的数据
          let arrs = Array(1000)
            .fill("")
            .map((item, index) => ({
              id: index,
              content: `第${index + 1}条数据`,
            }));
          console.log(arrs);
          //需要展示出来的数据
          let showData = computed(() => {
            return arrs.slice(start.value, end.value);
          });
          //容器的高度
          let containerHeigth = computed(() => {
            return size * shownum + "px";
          });
          //撑开容器内容高度的元素高度
          let barHeigth = computed(() => {
            return size * arrs.length + "px";
          });
          //列表项上滚动该表top值
          let listTop = computed(() => {
            return start.value * size + "px";
          });
          //容器的滚动事件
          function handleScroll() {
            //获取容器顶部滚动条的尺寸
            const scrollTop = container.value.scrollTop;
            //计算卷曲的数据条数,用计算的结果作为获取数据的起始和结束下标
            //起始的下标就是卷去的数据条数,向下取整
            start.value = Math.floor(scrollTop / size);
            //结束下标就是起始下标加上需要展示的数据条数
            end.value = start.value + shownum;
          }
          return {
            size,
            container,
            showData,
            containerHeigth,
            barHeigth,
            listTop,
            handleScroll,
          };
        },
      }).mount("#app");
    </script>
  </body>
</html>

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3提供了一个新的组件API,使得构建虚拟列表变得更加容易。下面是一个简单的实现示例: 1. 安装依赖: ```bash npm install vue@next npm install vue3-virtual-scroll-list ``` 2. 在组件中使用虚拟列表: ```vue <template> <virtual-scroll-list :size="50" :remain="20" :data-key="'id'" :data-sources="items" @scroll="handleScroll" > <template v-slot="{ data }"> <div v-for="item in data" :key="item.id">{{ item.text }}</div> </template> </virtual-scroll-list> </template> <script> import { ref } from 'vue' import VirtualScrollList from 'vue3-virtual-scroll-list' export default { components: { VirtualScrollList, }, setup() { const items = ref([]) // 初始化数据 for (let i = 0; i < 10000; i++) { items.value.push({ id: i, text: `Item ${i}`, }) } const handleScroll = (scrollTop) => { // 处理滚动事件 console.log(scrollTop) } return { items, handleScroll, } }, } </script> ``` 在这个示例中,我们使用 `vue3-virtual-scroll-list` 组件来实现虚拟列表。这个组件需要传入一些参数,包括: - `size`:每个项的高度 - `remain`:上下额外渲染项的数量 - `data-key`:数据中每个项的唯一标识符 - `data-sources`:数据源 - `scroll`:滚动事件的回调函数 在模板中,我们使用插槽来渲染每个项。同时,组件还会将已经渲染的项缓存起来,以提高性能。 在 `setup` 函数中,我们初始化了一个 `items` 的响应式变量,并将它传入 `data-sources` 中。我们还定义了一个 `handleScroll` 函数来处理滚动事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值