当前位置:首页 > 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();
      }
    }
  }
}

模板中使用方式:

vue 实现加载更多

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

性能优化建议

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

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

相关文章

vue 实现异步加载

vue 实现异步加载

Vue 异步加载的实现方法 动态导入组件(懒加载) 使用 import() 语法动态导入组件,Vue 会将其转换为异步加载的组件。适用于路由或组件按需加载。 const AsyncComponent…

jquery页面加载

jquery页面加载

jQuery 页面加载事件 在 jQuery 中,页面加载事件通常通过 $(document).ready() 或简写的 $() 来实现。这种方式确保代码在 DOM 完全加载后执行,但无需等待图片等资…

vue 实现懒加载

vue 实现懒加载

vue 实现懒加载的方法 在Vue中实现懒加载可以通过多种方式完成,以下是几种常见的方法: 使用Vue Router的懒加载 Vue Router支持动态导入组件,从而实现路由级别的懒加载。这种方式…

vue 实现点击更多

vue 实现点击更多

Vue 实现点击更多功能 在Vue中实现点击更多功能通常涉及展示部分内容,点击按钮后展开剩余内容。以下是几种常见实现方式: 使用v-show或v-if控制显示 通过布尔值变量控制内容的展开与收起:…

vue实现异步加载

vue实现异步加载

Vue 异步加载的实现方法 在 Vue 中实现异步加载可以通过多种方式完成,包括动态导入、路由懒加载和异步组件等。以下是几种常见的实现方法: 动态导入与异步组件 使用 Vue 的 defineAsy…

vue实现图片预加载

vue实现图片预加载

图片预加载的实现方法 在Vue中实现图片预加载可以提升用户体验,避免图片加载延迟导致的空白或闪烁。以下是几种常见的方法: 使用JavaScript的Image对象 创建一个Image对象并设置其sr…