当前位置:首页 > VUE

vue实现伪加载列表

2026-02-24 04:15:55VUE

Vue 实现伪加载列表

伪加载列表(也称为虚拟滚动或无限滚动)是一种优化长列表渲染性能的技术,通过仅渲染可视区域内的元素来减少 DOM 节点数量。以下是实现方法:

使用 vue-virtual-scroller 库

安装 vue-virtual-scroller 库:

npm install vue-virtual-scroller

在 Vue 项目中引入并使用:

import { RecycleScroller } from 'vue-virtual-scroller'
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'

export default {
  components: { RecycleScroller },
  data() {
    return {
      items: [], // 你的数据列表
      itemSize: 50 // 每个项目的高度
    }
  }
}

模板中使用:

vue实现伪加载列表

<RecycleScroller
  class="scroller"
  :items="items"
  :item-size="itemSize"
  key-field="id"
>
  <template v-slot="{ item }">
    <!-- 渲染单个列表项 -->
    <div>{{ item.name }}</div>
  </template>
</RecycleScroller>

自定义实现虚拟滚动

监听滚动事件并计算可视区域:

data() {
  return {
    visibleItems: [],
    startIndex: 0,
    endIndex: 20,
    itemHeight: 50,
    containerHeight: 500
  }
},
mounted() {
  this.updateVisibleItems()
  window.addEventListener('scroll', this.handleScroll)
},
methods: {
  handleScroll() {
    this.updateVisibleItems()
  },
  updateVisibleItems() {
    const scrollTop = window.pageYOffset || document.documentElement.scrollTop
    this.startIndex = Math.floor(scrollTop / this.itemHeight)
    this.endIndex = Math.min(
      this.startIndex + Math.ceil(this.containerHeight / this.itemHeight),
      this.items.length
    )
    this.visibleItems = this.items.slice(this.startIndex, this.endIndex)
  }
}

模板结构:

vue实现伪加载列表

<div class="scroll-container" :style="{ height: `${items.length * itemHeight}px` }">
  <div
    class="item"
    v-for="item in visibleItems"
    :key="item.id"
    :style="{ transform: `translateY(${item.index * itemHeight}px)` }"
  >
    {{ item.content }}
  </div>
</div>

使用 CSS 优化

为滚动容器和列表项添加样式:

.scroll-container {
  position: relative;
  overflow-y: auto;
}

.item {
  position: absolute;
  width: 100%;
  box-sizing: border-box;
}

性能考虑

  • 使用 key 属性确保高效的 DOM 复用
  • 避免在列表项中使用复杂的计算属性
  • 考虑使用 Object.freeze() 冻结静态数据
  • 对于超长列表,可以结合分页加载机制

动态加载数据

结合 API 实现无限滚动:

async loadMore() {
  if (this.isLoading) return
  this.isLoading = true
  const newItems = await fetchMoreData()
  this.items = [...this.items, ...newItems]
  this.isLoading = false
}

监听滚动到底部事件:

handleScroll() {
  const { scrollTop, clientHeight, scrollHeight } = document.documentElement
  if (scrollTop + clientHeight >= scrollHeight - 100) {
    this.loadMore()
  }
}

标签: 加载列表
分享给朋友:

相关文章

vue实现功能列表

vue实现功能列表

Vue 实现功能列表的方法 在 Vue 中实现功能列表通常涉及数据绑定、列表渲染、事件处理和状态管理。以下是几种常见的方法: 数据驱动列表渲染 使用 v-for 指令可以轻松实现列表渲染。假设有一个…

vue实现列表过渡

vue实现列表过渡

vue实现列表过渡的方法 在Vue中,可以使用内置的<transition-group>组件来实现列表项的过渡效果。该组件专门为动态列表设计,能够处理元素的添加、删除和顺序变化。 基本用…

vue实现延迟加载

vue实现延迟加载

Vue 实现延迟加载的方法 使用动态导入(Dynamic Import)和异步组件 在 Vue 中,可以通过动态导入语法结合异步组件实现延迟加载。这种方式会在需要时才加载组件,而不是在初始加载时一并加…

vue实现竖向列表

vue实现竖向列表

Vue 实现竖向列表的方法 使用 v-for 指令 通过 Vue 的 v-for 指令可以轻松渲染一个竖向列表。假设有一个数组 items,可以通过以下方式渲染: <template>…

vue实现图片列表

vue实现图片列表

实现图片列表的基本方法 在Vue中实现图片列表可以通过v-for指令遍历图片数据数组,结合<img>标签动态绑定src属性。以下是基本实现步骤: <template> &…

vue视频列表实现

vue视频列表实现

Vue 视频列表实现 数据准备 定义一个数组存储视频信息,每个视频对象包含标题、封面图、播放地址等属性。 data() { return { videos: [ {…