Vue2虚拟列表

文章介绍了如何使用Vue中的计算属性和DOM操作技巧,避免滚动条抖动问题,通过计算真实的渲染数据来动态调整列表视图,确保在没有数据时平滑滚动。

向上的距离要加在真实渲染的数据上,不然会出现没数据时,滚动条抖动,一下向上向下。

使用计算属性来动态改变,不要直接操作dom



<template>
<div class="box" @scroll="Handscroll" ref="box">
  <!-- 虚拟列表 -->
  <div class="list-all" :style="{ height: totalHeight + 'px' } ">
<!--    真实-->
    <div  ref=“excursion“ :style="{top:excursionTop+'px',position:'relative'}" style="height: 50px;width: 100%;line-height: 50px" v-for="(item,index) in visibleItems" :key="index">{{item}}</div>
  </div>
</div>
</template>
<script >
export default {
  data(){
    return{
      items: [], // 所有数据
      visibleItems: [], // 可见的数据项
      itemHeight: 50, // 列表项高度
      visibleCount: 0, // 可见的列表项数量
      startIndex: 0, // 开始渲染的列表项索引
      totalHeight:0 //虚拟列表高度
    }
  },
  computed:{
    excursionTop() {

      return this.startIndex * this.itemHeight;
    }
  },
  mounted() {

    // 计算可见的列表项数量
    this.visibleCount = Math.ceil(
      this.$refs.box.clientHeight / this.itemHeight
    );
    this.init();
    this.updateVisibleItems();

  },

  methods:{
    init(){
      for(let i=1 ;i<=10000;i++){
        this.items.push(i)
      }
      this.totalHeight = this.items.length * this.itemHeight;
    },
    Handscroll(){
      //获取滚动条位置
       let scrollTop= this.$refs.box.scrollTop;
      this.startIndex = Math.floor(scrollTop / this.itemHeight);
      // 更新可见的列表项
      this.updateVisibleItems();
    },
    updateVisibleItems() {
      // 根据开始索引和可见列表项数量切片获取可见的数据项
      this.visibleItems = this.items.slice(
        this.startIndex,
        this.startIndex + this.visibleCount
      );
    }
  }
}
</script>
<style scoped lang="scss">
.box{
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%,-50%);
   height: 300px;
  width: 300px;
  overflow-y: scroll;
  background-color: yellow;
  .list-all{
    height: 300px;
    width: 200px;
    margin-left: 50px;
    text-align: center;
  }
}
</style>

### 创建包含头部的虚拟滚动列表组件 为了在 Vue3 中创建一个带有 header 的虚拟滚动列表组件,可以采用以下方法: #### 1. 使用第三方库实现虚拟滚动 对于大型数据集来说,使用成熟的第三方库来处理虚拟滚动是一个不错的选择。`vue-virtual-scroller` 是一款适用于 Vue 应用程序的高效虚拟滚动插件[^1]。 安装 `vue-virtual-scroller` 后,在项目中引入并注册此组件: ```bash npm install vue-virtual-scroller --save ``` 接着可以在模板文件里这样定义带 Header 的虚拟列表结构: ```html <RecycleScroller class="scroller" :items="bigList" :item-size="30" key-field="id" v-slot="{ item }"> <div class="header">Header</div> <div>{{ item.name }}</div> </RecycleScroller> ``` #### 2. 自定义实现简单版虚拟滚动逻辑 如果不想依赖外部库或者希望更深入理解其工作原理,则可以通过监听容器的高度变化以及计算可视区域内的条目索引来手动模拟这一过程。这里需要注意的是要确保左侧下标的准确性,这可能涉及到 DOM 结构调整或样式修正等问题。 编写自定义组件时,建议遵循如下思路: - 计算视口高度和每项的高度; - 根据滚动位置确定可见范围内的起始/结束索引; - 动态渲染这些范围内项目的 HTML 片段; - 处理边界情况如首次加载、快速翻页等特殊情形下的表现。 #### 3. 添加固定表头功能 为了让页面有更好的用户体验,通常还会给这样的列表加上固定的表头(即吸顶效果)。通过 CSSJavaScript 协同作用很容易达成这个目标[^2]。 设置一个绝对定位的 div 来作为悬浮标题栏,并利用 Intersection Observer API 或者简单的 scroll 事件监听器检测何时触发显示/隐藏动作。 ```css .fixed-header { position: fixed; top: 0; width: 100%; background-color: white; z-index: 999; } ``` 最后将上述两种技术结合起来就能得到既支持大量数据展示又具有良好交互体验的理想化解决方案了。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值