当前位置:首页 > VUE

vue实现触底加载

2026-03-29 04:15:43VUE

触底加载的实现原理

触底加载的核心是监听滚动事件,判断页面是否滚动到底部。当滚动条接近底部时触发数据加载。Vue中可以通过结合v-infinite-scroll指令或手动监听滚动事件实现。

vue实现触底加载

使用v-infinite-scroll指令(Element UI)

安装Element UI后,可直接使用其内置的无限滚动指令:

vue实现触底加载

<template>
  <div 
    v-infinite-scroll="loadMore" 
    infinite-scroll-disabled="busy" 
    infinite-scroll-distance="100"
  >
    <div v-for="item in list" :key="item.id">{{ item.content }}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      busy: false,
      page: 1
    }
  },
  methods: {
    loadMore() {
      this.busy = true;
      fetch(`/api/data?page=${this.page}`)
        .then(res => res.json())
        .then(data => {
          this.list.push(...data);
          this.page++;
          this.busy = false;
        });
    }
  }
}
</script>

手动实现滚动监听

如果没有使用UI库,可通过原生滚动监听实现:

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

<script>
export default {
  data() {
    return {
      list: [],
      loading: false,
      page: 1
    }
  },
  methods: {
    handleScroll(e) {
      const { scrollTop, clientHeight, scrollHeight } = e.target;
      const threshold = 100;
      if (scrollHeight - (scrollTop + clientHeight) < threshold && !this.loading) {
        this.loadMore();
      }
    },
    loadMore() {
      this.loading = true;
      fetch(`/api/data?page=${this.page}`)
        .then(res => res.json())
        .then(data => {
          this.list.push(...data);
          this.page++;
          this.loading = false;
        });
    }
  }
}
</script>

<style>
.scroll-container {
  height: 500px;
  overflow-y: auto;
}
</style>

使用Intersection Observer API

现代浏览器支持更高效的交叉观察器API:

<template>
  <div class="container">
    <div v-for="item in list" :key="item.id">{{ item.content }}</div>
    <div ref="loader" v-if="hasMore">加载中...</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      hasMore: true,
      page: 1,
      observer: null
    }
  },
  mounted() {
    this.observer = new IntersectionObserver(entries => {
      if (entries[0].isIntersecting && this.hasMore) {
        this.loadMore();
      }
    });
    this.observer.observe(this.$refs.loader);
  },
  beforeDestroy() {
    this.observer.disconnect();
  },
  methods: {
    loadMore() {
      fetch(`/api/data?page=${this.page}`)
        .then(res => res.json())
        .then(data => {
          if (data.length === 0) this.hasMore = false;
          this.list.push(...data);
          this.page++;
        });
    }
  }
}
</script>

注意事项

  • 节流处理:滚动事件可能频繁触发,需要添加防抖/节流
  • 加载状态管理:避免重复请求
  • 数据为空判断:当没有更多数据时应停止加载
  • 错误处理:添加请求失败的处理逻辑
  • 移动端适配:考虑移动端的滚动容器差异

标签: 加载触底
分享给朋友:

相关文章

jquery 加载

jquery 加载

jQuery 加载方法 使用jQuery需要先将其库文件加载到网页中。以下是几种常见的加载方式: 通过CDN加载 推荐使用官方或公共CDN(内容分发网络)加载jQuery,速度快且可能被浏览器缓存:…

js实现页面加载

js实现页面加载

监听 DOMContentLoaded 事件 使用 DOMContentLoaded 事件可以在 HTML 文档完全加载和解析后触发,无需等待样式表、图像等外部资源加载完成。 document.…

vue实现滚动加载

vue实现滚动加载

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

vue实现无限加载

vue实现无限加载

Vue 实现无限加载的方法 无限加载(Infinite Scroll)是一种常见的用户体验优化方式,适用于数据量较大的列表或瀑布流场景。以下是几种在 Vue 中实现无限加载的常用方法。 监听滚动事件…

vue实现异步加载

vue实现异步加载

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

vue怎么实现加载速度

vue怎么实现加载速度

优化 Vue 项目的加载速度 代码分割与懒加载 使用动态导入(import())实现路由懒加载和组件懒加载。在路由配置中,将组件改为函数形式动态加载: const Home = () => i…