当前位置:首页 > VUE

vue实现下拉加载

2026-02-24 06:35:30VUE

Vue 实现下拉加载的方法

使用 IntersectionObserver API

IntersectionObserver API 可以监听元素是否进入视口,适合实现下拉加载功能。

<template>
  <div>
    <div v-for="item in items" :key="item.id">{{ item.content }}</div>
    <div ref="loader" class="loader">Loading...</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [],
      page: 1,
      isLoading: false
    }
  },
  mounted() {
    this.initObserver();
    this.loadItems();
  },
  methods: {
    initObserver() {
      const observer = new IntersectionObserver((entries) => {
        if (entries[0].isIntersecting && !this.isLoading) {
          this.loadMore();
        }
      });
      observer.observe(this.$refs.loader);
    },
    async loadItems() {
      this.isLoading = true;
      const newItems = await fetchItems(this.page);
      this.items = [...this.items, ...newItems];
      this.isLoading = false;
    },
    loadMore() {
      this.page++;
      this.loadItems();
    }
  }
}
</script>

使用滚动事件监听

通过监听滚动事件判断是否到达底部,触发加载更多数据。

<template>
  <div @scroll="handleScroll" class="scroll-container">
    <div v-for="item in items" :key="item.id">{{ item.content }}</div>
    <div v-if="isLoading" class="loader">Loading...</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [],
      page: 1,
      isLoading: false
    }
  },
  mounted() {
    this.loadItems();
    window.addEventListener('scroll', this.handleScroll);
  },
  beforeDestroy() {
    window.removeEventListener('scroll', this.handleScroll);
  },
  methods: {
    handleScroll() {
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      const scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
      const clientHeight = document.documentElement.clientHeight || window.innerHeight;

      if (scrollTop + clientHeight >= scrollHeight - 100 && !this.isLoading) {
        this.loadMore();
      }
    },
    async loadItems() {
      this.isLoading = true;
      const newItems = await fetchItems(this.page);
      this.items = [...this.items, ...newItems];
      this.isLoading = false;
    },
    loadMore() {
      this.page++;
      this.loadItems();
    }
  }
}
</script>

使用第三方库

可以使用现成的 Vue 插件如 vue-infinite-loading 简化实现。

安装插件:

npm install vue-infinite-loading

使用示例:

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

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

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

注意事项

  • 确保在组件销毁时移除事件监听,避免内存泄漏。
  • 添加防抖或节流处理滚动事件,避免频繁触发。
  • 显示加载状态和错误处理,提升用户体验。
  • 在移动端需要考虑触摸事件的兼容性。

vue实现下拉加载

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

相关文章

vue实现倒计时抢券

vue实现倒计时抢券

Vue 实现倒计时抢券功能 核心逻辑 倒计时抢券功能需要结合时间计算、状态管理和界面交互。通过 Vue 的响应式特性和生命周期钩子,可以高效实现这一需求。 实现步骤 1. 数据准备 在 Vue 组件…

vue 实现grid

vue 实现grid

在Vue中实现Grid布局可以通过多种方式完成,以下是几种常见的方法: 使用CSS Grid布局 CSS Grid是一种强大的布局系统,可以直接在Vue组件的样式中使用。以下是一个简单的示例:…

实现 vue 框架

实现 vue 框架

Vue 框架的基本实现 Vue 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现 Vue 框架的基本步骤和核心概念。 核心概念 响应式数据绑定 Vue 的核心特性之一是响应式…

甘特图vue实现

甘特图vue实现

甘特图 Vue 实现方法 使用开源库 vue-ganttastic 安装依赖: npm install vue-ganttastic 基础实现代码: <template> <…

vue实现筛选

vue实现筛选

实现筛选功能的基本思路 在Vue中实现筛选功能通常需要结合数据绑定、计算属性和方法。筛选的核心逻辑是根据用户输入的条件过滤原始数据列表,并动态更新显示结果。 数据准备 定义一个数组存储原始数据,另…

vue实现uuid

vue实现uuid

使用 uuid 库生成 UUID 在 Vue 项目中,可以使用 uuid 库来生成 UUID。安装依赖: npm install uuid 在 Vue 组件中使用: import { v4 as…