当前位置:首页 > VUE

vue 实现加载更多

2026-02-18 18:30:52VUE

Vue 实现加载更多功能

数据准备与状态管理

在Vue组件中定义必要的数据状态,包括当前页码、每页数据量、总数据量以及数据列表。使用dataref(Composition API)进行初始化:

data() {
  return {
    page: 1,
    pageSize: 10,
    total: 0,
    list: [],
    loading: false,
    noMore: false
  }
}

获取数据的方法

创建异步方法用于从API获取数据。该方法需要处理分页参数和加载状态:

methods: {
  async fetchData() {
    if (this.loading || this.noMore) return;
    this.loading = true;

    try {
      const res = await api.getList({
        page: this.page,
        pageSize: this.pageSize
      });

      this.list = [...this.list, ...res.data.list];
      this.total = res.data.total;
      this.noMore = this.list.length >= this.total;
      this.page++;
    } finally {
      this.loading = false;
    }
  }
}

滚动监听实现

mounted钩子中添加滚动事件监听,计算是否到达页面底部:

mounted() {
  window.addEventListener('scroll', this.handleScroll);
},
beforeDestroy() {
  window.removeEventListener('scroll', this.handleScroll);
},
methods: {
  handleScroll() {
    const scrollHeight = document.documentElement.scrollHeight;
    const scrollTop = document.documentElement.scrollTop;
    const clientHeight = document.documentElement.clientHeight;

    if (scrollTop + clientHeight >= scrollHeight - 100 && !this.loading) {
      this.fetchData();
    }
  }
}

模板渲染

在模板中渲染列表数据和加载状态:

<template>
  <div>
    <div v-for="item in list" :key="item.id">
      <!-- 列表项内容 -->
    </div>

    <div v-if="loading">加载中...</div>
    <div v-if="noMore">没有更多数据了</div>
  </div>
</template>

使用第三方库(可选)

可以考虑使用现成的无限滚动组件,如vue-infinite-loading

import InfiniteLoading from 'vue-infinite-loading';

export default {
  components: { InfiniteLoading },
  methods: {
    async onInfinite($state) {
      try {
        const res = await api.getList({
          page: this.page,
          pageSize: this.pageSize
        });

        if (res.data.list.length) {
          this.list.push(...res.data.list);
          this.page++;
          $state.loaded();
        } else {
          $state.complete();
        }
      } catch (err) {
        $state.error();
      }
    }
  }
}

模板中使用方式:

<infinite-loading @infinite="onInfinite"></infinite-loading>

性能优化建议

  1. 添加防抖处理滚动事件,避免频繁触发
  2. 在组件销毁时移除事件监听
  3. 对API请求进行错误处理
  4. 使用骨架屏提升用户体验
  5. 移动端考虑使用Intersection Observer API替代滚动监听

vue 实现加载更多

标签: 加载更多
分享给朋友:

相关文章

vue加载动画实现

vue加载动画实现

Vue 加载动画的实现方法 在 Vue 中实现加载动画可以通过多种方式完成,以下是一些常见的方法: 使用 CSS 动画 通过 CSS 定义动画效果,结合 Vue 的动态类绑定或条件渲染控制动画的显示…

vue加载实现分页

vue加载实现分页

Vue 实现分页加载的方法 使用 Element UI 的分页组件 安装 Element UI 后,可以直接使用其分页组件。在模板中添加分页组件,并绑定相关事件和数据。 <template&g…

js实现页面加载

js实现页面加载

监听 DOMContentLoaded 事件 使用 DOMContentLoaded 事件可以在 HTML 文档完全加载和解析后触发,无需等待样式表、图像等外部资源加载完成。 document…

js实现图片的懒加载

js实现图片的懒加载

实现图片懒加载的基本原理 懒加载的核心思想是延迟加载非视口内的图片,当用户滚动页面时再动态加载即将进入视口的图片资源。这能显著减少页面初始加载时的网络请求和带宽消耗。 Intersection Ob…

vue实现无线加载

vue实现无线加载

无限滚动加载的实现 在Vue中实现无限滚动加载(Infinite Scroll)可以通过监听滚动事件或使用现成的库完成。以下是两种常见方法: 使用原生滚动事件监听 通过监听滚动事件判断是否到…

vue实现同步加载

vue实现同步加载

Vue 实现同步加载的方法 在 Vue 中,通常推荐使用异步加载(如 async/await 或 Promise)来优化性能,但在某些场景下可能需要同步加载。以下是几种实现同步加载的方法: 使用…