当前位置:首页 > 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中为列表添加水印可以通过多种方式实现,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性为列表元素添加水印背景。水印可以是文字或图…

react如何加载网页

react如何加载网页

使用 React 加载网页的方法 通过 iframe 嵌入网页 在 React 组件中,可以通过 iframe 标签直接加载外部网页。这种方式简单直接,适合嵌入第三方页面或静态内容。 import…

vue实现奇偶列表

vue实现奇偶列表

Vue实现奇偶列表样式 在Vue中实现列表项的奇偶不同样式,可以通过多种方式实现。以下是几种常见方法: 使用v-for和动态class绑定 通过v-for循环生成列表时,利用索引值判断奇偶性并绑定…

vue 实现列表多选

vue 实现列表多选

Vue 实现列表多选的方法 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动处理多选逻辑。适用于复选框(checkbox)场景。 <template> &…

vue实现滑动加载

vue实现滑动加载

滑动加载的实现思路 滑动加载通常通过监听滚动事件,判断是否滚动到页面底部来触发数据加载。Vue中可以通过结合v-for、@scroll事件和计算属性实现。 基础实现方法 监听滚动事件 在包含滚动区域…

js实现图片加载

js实现图片加载

使用Image对象加载图片 通过JavaScript的Image对象可以动态加载图片,适用于需要预加载或动态插入图片的场景。 const img = new Image(); img.src =…