当前位置:首页 > 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替代滚动监听

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

相关文章

react如何延迟加载

react如何延迟加载

延迟加载的实现方法 在React中实现延迟加载(Lazy Loading)通常指按需加载组件或资源,以提升初始页面加载性能。以下是几种常见方法: 使用React.lazy和Suspense Reac…

js实现图片加载

js实现图片加载

使用Image对象加载图片 通过JavaScript的Image对象可以动态加载图片,适用于需要预加载或动态插入图片的场景。 const img = new Image(); img.src =…

vue实现滚动加载

vue实现滚动加载

滚动加载的实现方法 滚动加载是一种常见的前端交互方式,适用于长列表或数据量大的场景。Vue中可以通过监听滚动事件或使用Intersection Observer API实现。 使用滚动事件监听 在V…

vue 实现加载更多

vue 实现加载更多

Vue 实现加载更多功能 实现加载更多功能通常结合分页数据与滚动事件监听,以下是几种常见方法: 滚动监听 + 分页加载 监听滚动事件,当滚动到底部时触发加载更多数据: <template&g…

vue如何实现异步加载

vue如何实现异步加载

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

vue实现视频预加载

vue实现视频预加载

实现视频预加载的方法 在Vue中实现视频预加载可以通过多种方式完成,关键在于提前加载视频资源,确保播放时流畅无卡顿。 使用<video>标签的preload属性 <templat…