当前位置:首页 > 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获取数据。该方法需要处理分页参数和加载状态:

vue 实现加载更多

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();
    }
  }
}

模板渲染

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

vue 实现加载更多

<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替代滚动监听

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

相关文章

加载jquery

加载jquery

加载 jQuery 的方法 通过 CDN 加载 推荐使用官方或公共 CDN(内容分发网络)加载 jQuery,速度快且稳定。将以下代码添加到 HTML 文件的 <head> 或 <b…

vue实现无线加载

vue实现无线加载

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

vue实现 懒加载

vue实现 懒加载

懒加载的实现方式 在Vue中实现懒加载可以通过多种方式,常见的包括路由懒加载和组件懒加载。以下是具体实现方法: 路由懒加载 路由懒加载是通过动态导入组件的方式实现的,适用于Vue Router的路由…

vue实现滚动鼠标加载

vue实现滚动鼠标加载

vue实现滚动鼠标加载的实现方法 使用Intersection Observer API Intersection Observer API可以监听元素是否进入视口,适合实现滚动加载。在Vue中可以通…

vue实现异步加载组件

vue实现异步加载组件

异步组件的基本实现 在 Vue 中可以通过动态 import() 语法实现组件的异步加载。这种方式会返回一个 Promise,Vue 会在需要时自动处理加载逻辑。 const AsyncCompon…

vue怎么实现滚动加载

vue怎么实现滚动加载

滚动加载的实现方法 在Vue中实现滚动加载通常结合IntersectionObserver或监听滚动事件,动态加载数据。以下是两种常见实现方式: 使用IntersectionObserver…