当前位置:首页 > VUE

vue实现上拉加载

2026-01-23 01:26:12VUE

Vue 实现上拉加载

使用 Intersection Observer API

Intersection Observer API 可以监听元素是否进入视口,适合实现上拉加载。

<template>
  <div>
    <div v-for="item in list" :key="item.id">{{ item.content }}</div>
    <div ref="loader" v-if="!isLoading && hasMore">加载更多...</div>
    <div v-if="isLoading">加载中...</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      isLoading: false,
      hasMore: true,
      page: 1
    };
  },
  mounted() {
    this.initObserver();
    this.loadData();
  },
  methods: {
    initObserver() {
      const observer = new IntersectionObserver((entries) => {
        if (entries[0].isIntersecting && !this.isLoading && this.hasMore) {
          this.loadData();
        }
      });
      observer.observe(this.$refs.loader);
    },
    async loadData() {
      this.isLoading = true;
      try {
        const newData = await fetchData(this.page);
        this.list = [...this.list, ...newData];
        this.page++;
        this.hasMore = newData.length > 0;
      } catch (error) {
        console.error(error);
      } finally {
        this.isLoading = false;
      }
    }
  }
};
</script>

使用滚动事件监听

通过监听滚动事件,计算滚动位置触发加载。

<template>
  <div ref="container" @scroll="handleScroll">
    <div v-for="item in list" :key="item.id">{{ item.content }}</div>
    <div v-if="isLoading">加载中...</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      isLoading: false,
      hasMore: true,
      page: 1
    };
  },
  mounted() {
    this.loadData();
  },
  methods: {
    handleScroll() {
      const container = this.$refs.container;
      const scrollBottom = container.scrollHeight - container.scrollTop - container.clientHeight;
      if (scrollBottom < 50 && !this.isLoading && this.hasMore) {
        this.loadData();
      }
    },
    async loadData() {
      this.isLoading = true;
      try {
        const newData = await fetchData(this.page);
        this.list = [...this.list, ...newData];
        this.page++;
        this.hasMore = newData.length > 0;
      } catch (error) {
        console.error(error);
      } finally {
        this.isLoading = false;
      }
    }
  }
};
</script>

使用第三方库

Vue-infinite-loading 是一个专门用于无限滚动的 Vue 插件。

安装:

npm install vue-infinite-loading

使用:

<template>
  <div>
    <div v-for="item in list" :key="item.id">{{ item.content }}</div>
    <infinite-loading @infinite="loadData"></infinite-loading>
  </div>
</template>

<script>
import InfiniteLoading from 'vue-infinite-loading';

export default {
  components: {
    InfiniteLoading
  },
  data() {
    return {
      list: [],
      page: 1
    };
  },
  methods: {
    async loadData($state) {
      try {
        const newData = await fetchData(this.page);
        this.list = [...this.list, ...newData];
        this.page++;
        if (newData.length) {
          $state.loaded();
        } else {
          $state.complete();
        }
      } catch (error) {
        $state.error();
      }
    }
  }
};
</script>

注意事项

  • 确保在组件销毁时移除事件监听或断开 Intersection Observer。
  • 添加防抖或节流避免频繁触发加载。
  • 处理加载失败的情况,提供重试机制。
  • 移动端需要考虑滚动性能优化。

vue实现上拉加载

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

相关文章

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。…

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…

vue调用接口实现退出

vue调用接口实现退出

实现Vue退出功能的步骤 在Vue中调用接口实现退出功能通常需要与后端API交互,以下是实现方法: 前端实现 创建退出方法,调用后端API接口: methods: { logout()…

vue2实现图片懒加载

vue2实现图片懒加载

Vue2 图片懒加载实现方法 使用 Intersection Observer API Intersection Observer API 是浏览器原生支持的懒加载方案,性能较好且无需额外库。 //…

vue 实现

vue 实现

Vue 实现的基本步骤 安装 Vue.js 可以通过 npm 或 CDN 引入。使用 npm 安装适合大型项目,CDN 适合快速原型开发。 npm install vue 在 HTML 文件中引入…

vue实现贴图

vue实现贴图

Vue 实现贴图功能 在Vue中实现贴图功能通常涉及将图片动态添加到指定位置或元素上。以下是几种常见实现方式: 使用v-bind动态绑定图片 通过数据驱动的方式动态更换图片源: <tem…