当前位置:首页 > VUE

vue实现列表懒加载

2026-02-24 02:22:53VUE

vue实现列表懒加载的方法

使用IntersectionObserver API

IntersectionObserver API可以监听元素是否进入视口,适合实现懒加载。在Vue中可以通过自定义指令或组件实现。

// 自定义指令实现
Vue.directive('lazy', {
  inserted: (el, binding) => {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          binding.value()
          observer.unobserve(el)
        }
      })
    })
    observer.observe(el)
  }
})

// 组件中使用
<template>
  <div v-lazy="loadMore">加载更多...</div>
</template>

使用第三方库vue-lazyload

vue-lazyload是专门为Vue设计的懒加载库,支持图片和组件懒加载。

import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload, {
  preLoad: 1.3,
  attempt: 3
})

// 使用方式
<img v-lazy="imageUrl">

滚动事件监听实现

通过监听滚动事件计算元素位置,判断是否需要加载。

methods: {
  handleScroll() {
    const scrollBottom = window.innerHeight + window.scrollY
    const elementTop = this.$refs.loadMore.getBoundingClientRect().top + window.scrollY
    if (scrollBottom > elementTop - 100) {
      this.loadMore()
    }
  }
},
mounted() {
  window.addEventListener('scroll', this.handleScroll)
},
beforeDestroy() {
  window.removeEventListener('scroll', this.handleScroll)
}

无限滚动组件实现

封装可复用的无限滚动组件,适用于分页加载场景。

<template>
  <div class="infinite-scroll" @scroll="onScroll">
    <slot></slot>
    <div v-if="loading" class="loading">加载中...</div>
  </div>
</template>

<script>
export default {
  props: {
    loading: Boolean,
    distance: {
      type: Number,
      default: 50
    }
  },
  methods: {
    onScroll(e) {
      const { scrollTop, scrollHeight, clientHeight } = e.target
      if (scrollHeight - (scrollTop + clientHeight) < this.distance && !this.loading) {
        this.$emit('load-more')
      }
    }
  }
}
</script>

虚拟滚动优化性能

对于超长列表,使用虚拟滚动技术只渲染可见区域元素。

vue实现列表懒加载

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

components: {
  RecycleScroller
}

<template>
  <RecycleScroller
    class="scroller"
    :items="list"
    :item-size="50"
    key-field="id"
    v-slot="{ item }"
  >
    <div class="item">{{ item.text }}</div>
  </RecycleScroller>
</template>

每种方法适用于不同场景,IntersectionObserver API最现代且性能最好,vue-lazyload适合图片懒加载,滚动事件监听兼容性最好,无限滚动组件适合分页加载,虚拟滚动适合超长列表优化性能。

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

相关文章

vue加载动画实现

vue加载动画实现

Vue 加载动画实现方法 使用 CSS 动画或过渡 在 Vue 组件中可以直接通过 CSS 实现加载动画效果。定义一个简单的旋转动画: .loading-spinner { width: 40p…

vue实现搜索列表

vue实现搜索列表

Vue 实现搜索列表功能 在 Vue 中实现搜索列表功能通常需要以下几个关键步骤: 数据绑定与列表渲染 使用 v-model 绑定搜索输入框,监听用户输入。通过 v-for 指令渲染过滤后的列表数据…

vue实现传输列表

vue实现传输列表

Vue 实现传输列表 在 Vue 中实现传输列表功能,通常涉及两个列表之间的数据传递,用户可以通过按钮或拖拽操作将项目从一个列表移动到另一个列表。以下是实现传输列表的几种方法。 使用组件间数据传递…

vue实现列表页面

vue实现列表页面

Vue 列表页面实现方案 基础列表渲染 使用 v-for 指令渲染数组数据,配合 :key 提升性能: <template> <ul> <li v-for=…

vue实现列表菜单

vue实现列表菜单

实现列表菜单的基本结构 在 Vue 中实现列表菜单通常使用 v-for 指令动态渲染菜单项。定义一个数组存储菜单数据,通过 v-for 遍历数组生成菜单项。 <template> &…

vue实现列表连线

vue实现列表连线

实现列表连线的基本思路 在Vue中实现列表连线效果,可以通过动态渲染DOM元素并结合CSS样式来完成。关键在于获取列表项的位置信息,并通过计算连线路径。 使用CSS和伪元素实现简单连线 对于简单的垂…