当前位置:首页 > VUE

vue 实现滑动加载

2026-02-20 05:28:19VUE

实现滑动加载的基本思路

滑动加载通常通过监听滚动事件,判断是否滚动到页面底部来触发数据加载。Vue中可以利用v-infinite-scroll指令或手动监听滚动事件实现。

使用v-infinite-scroll指令

Element UI等库提供了v-infinite-scroll指令,简化实现:

vue 实现滑动加载

<template>
  <div v-infinite-scroll="loadMore" :infinite-scroll-disabled="busy" infinite-scroll-distance="10">
    <div v-for="item in items" :key="item.id">{{ item.content }}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [],
      busy: false,
      page: 1
    }
  },
  methods: {
    loadMore() {
      this.busy = true
      fetchData(this.page).then(newItems => {
        this.items = [...this.items, ...newItems]
        this.page++
        this.busy = false
      })
    }
  }
}
</script>

手动实现滚动监听

没有使用UI库时,可以手动实现:

<template>
  <div class="scroll-container" @scroll="handleScroll">
    <div v-for="item in items" :key="item.id">{{ item.content }}</div>
    <div v-if="loading">Loading...</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [],
      loading: false,
      page: 1,
      noMore: false
    }
  },
  methods: {
    handleScroll(e) {
      const container = e.target
      const bottomOffset = container.scrollHeight - container.scrollTop - container.clientHeight
      if (bottomOffset < 50 && !this.loading && !this.noMore) {
        this.loadMore()
      }
    },
    loadMore() {
      this.loading = true
      fetchData(this.page).then(newItems => {
        if (newItems.length === 0) {
          this.noMore = true
        } else {
          this.items = [...this.items, ...newItems]
          this.page++
        }
        this.loading = false
      })
    }
  }
}
</script>

<style>
.scroll-container {
  height: 500px;
  overflow-y: auto;
}
</style>

性能优化建议

添加防抖避免频繁触发滚动事件:

vue 实现滑动加载

import { debounce } from 'lodash'

methods: {
  handleScroll: debounce(function(e) {
    // 滚动处理逻辑
  }, 200)
}

使用Intersection Observer API实现更高效的检测:

mounted() {
  const observer = new IntersectionObserver((entries) => {
    if (entries[0].isIntersecting && !this.loading && !this.noMore) {
      this.loadMore()
    }
  })
  observer.observe(this.$refs.observerTarget)
}

注意事项

确保在组件销毁时移除事件监听:

beforeDestroy() {
  window.removeEventListener('scroll', this.handleScroll)
}

分页加载时需要考虑数据去重问题,避免重复加载相同数据。

标签: 加载vue
分享给朋友:

相关文章

vue实现文字播放栏

vue实现文字播放栏

Vue 实现文字播放栏(跑马灯效果) 方法一:使用 CSS 动画 + Vue 数据绑定 通过 CSS 的 @keyframes 实现动画效果,结合 Vue 的动态数据绑定控制内容。 <tem…

vue ref实现

vue ref实现

Vue 中 ref 的实现 在 Vue 中,ref 是一个用于创建响应式引用的 API,适用于基本类型和对象。以下是 ref 的核心实现原理和使用方法。 基本实现原理 ref 通过 Reactive…

vue实现menu

vue实现menu

Vue 实现 Menu 的方法 使用 Element UI 的 Menu 组件 Element UI 提供了现成的 Menu 组件,适合快速实现导航菜单。安装 Element UI 后,可以直接使用…

vue实现刷新

vue实现刷新

Vue 实现页面刷新的方法 在Vue中实现页面刷新可以通过多种方式,以下是几种常见的方法: 使用 window.location.reload() 通过调用浏览器的原生方法强制刷新当前页面:…

vue怎么实现加减

vue怎么实现加减

Vue实现加减功能的方法 使用v-model绑定数据 在Vue中可以通过v-model双向绑定数据,结合methods方法实现加减功能。定义一个数字变量,通过按钮触发增减方法。 <templa…

vue 实现导出pdf

vue 实现导出pdf

使用 html2canvas 和 jsPDF 实现导出 PDF 在 Vue 项目中安装 html2canvas 和 jsPDF 依赖: npm install html2canvas jspdf 创…