当前位置:首页 > 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>

使用滚动事件监听

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

vue实现下拉加载

<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 简化实现。

vue实现下拉加载

安装插件:

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-ganttastic) 安装依赖库: npm install vue-ganttastic 示例代码: <template> &l…

vue实现气泡

vue实现气泡

Vue 实现气泡效果的方法 在 Vue 中实现气泡效果可以通过 CSS 动画、第三方库或自定义组件完成。以下是几种常见实现方式: 使用纯 CSS 和 Vue 过渡 通过 Vue 的过渡系统结合 CS…

vue  实现分页

vue 实现分页

实现分页的基本思路 在Vue中实现分页通常需要结合后端API返回的数据和前端的分页组件。分页的核心逻辑包括计算总页数、处理当前页码变化以及触发数据请求。 分页组件示例 使用Element UI的分页…

vue 实现hover

vue 实现hover

Vue 实现 Hover 效果的方法 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 伪类 :hover 最简单的方式是直接使用 CSS 的 :hov…

vue实现搜索提示

vue实现搜索提示

Vue实现搜索提示的方法 使用v-model绑定输入框 通过v-model将输入框的值与Vue实例中的数据进行双向绑定,实时获取用户输入内容。 <input v-model="searchQu…

vue实现拦截登录

vue实现拦截登录

Vue 实现登录拦截的方法 使用路由守卫进行拦截 Vue Router 提供了全局前置守卫 beforeEach,可以在路由跳转前进行验证。在路由配置文件中添加以下代码: import router…