当前位置:首页 > VUE

vue实现触底加载

2026-01-16 03:48:50VUE

触底加载的实现方法

在Vue中实现触底加载功能,可以通过监听滚动事件或使用Intersection Observer API来实现。以下是两种常见的方法:

监听滚动事件

在组件中监听滚动事件,计算滚动位置判断是否触底。

<template>
  <div class="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 container = e.target
      const scrollHeight = container.scrollHeight
      const scrollTop = container.scrollTop
      const clientHeight = container.clientHeight

      if (scrollHeight - scrollTop <= clientHeight + 50 && !this.loading) {
        this.loadMore()
      }
    },
    loadMore() {
      this.loading = true
      // 模拟异步加载数据
      setTimeout(() => {
        const newData = Array(10).fill(0).map((_, i) => ({
          id: this.list.length + i,
          content: `内容 ${this.list.length + i}`
        }))
        this.list = [...this.list, ...newData]
        this.page++
        this.loading = false
      }, 1000)
    }
  },
  mounted() {
    this.loadMore()
  }
}
</script>

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

使用Intersection Observer API

这种方法更现代,性能更好,不需要频繁计算滚动位置。

<template>
  <div class="container">
    <div v-for="item in list" :key="item.id">{{ item.content }}</div>
    <div ref="loader" v-if="!finished">{{ loading ? '加载中...' : '' }}</div>
    <div v-if="finished">没有更多了</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      loading: false,
      page: 1,
      finished: false
    }
  },
  methods: {
    initObserver() {
      const observer = new IntersectionObserver((entries) => {
        if (entries[0].isIntersecting && !this.loading && !this.finished) {
          this.loadMore()
        }
      })
      observer.observe(this.$refs.loader)
    },
    loadMore() {
      this.loading = true
      // 模拟异步加载数据
      setTimeout(() => {
        const newData = Array(10).fill(0).map((_, i) => ({
          id: this.list.length + i,
          content: `内容 ${this.list.length + i}`
        }))
        this.list = [...this.list, ...newData]
        this.page++
        this.loading = false

        // 模拟数据加载完毕
        if (this.page > 5) {
          this.finished = true
        }
      }, 1000)
    }
  },
  mounted() {
    this.loadMore()
    this.initObserver()
  }
}
</script>

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

使用第三方库

也可以使用现成的Vue指令或组件来实现触底加载,例如:

npm install vue-infinite-loading

使用示例:

vue实现触底加载

<template>
  <div class="container">
    <div v-for="item in list" :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 {
      list: [],
      page: 1
    }
  },
  methods: {
    loadMore($state) {
      setTimeout(() => {
        const newData = Array(10).fill(0).map((_, i) => ({
          id: this.list.length + i,
          content: `内容 ${this.list.length + i}`
        }))
        this.list = [...this.list, ...newData]
        this.page++

        if (this.page > 5) {
          $state.complete()
        } else {
          $state.loaded()
        }
      }, 1000)
    }
  },
  mounted() {
    this.loadMore()
  }
}
</script>

注意事项

  1. 节流处理:滚动事件需要节流处理,避免频繁触发
  2. 加载状态管理:确保不会重复触发加载
  3. 数据加载完毕处理:需要显示"没有更多数据"的提示
  4. 错误处理:网络请求失败时需要提供重试机制
  5. 移动端适配:需要考虑移动端的滚动行为差异

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

相关文章

加载jquery

加载jquery

加载 jQuery 的方法 通过 CDN 加载 推荐使用官方或公共 CDN(内容分发网络)加载 jQuery,速度快且稳定。将以下代码添加到 HTML 文件的 <head> 或 <b…

vue加载实现分页

vue加载实现分页

Vue 实现分页加载的方法 使用 Element UI 的分页组件 安装 Element UI 后,可以直接使用其分页组件。在模板中添加分页组件,并绑定相关事件和数据。 <template&g…

js实现图片加载

js实现图片加载

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

vue 实现滚动加载

vue 实现滚动加载

Vue 实现滚动加载的方法 滚动加载(Infinite Scroll)是常见的前端功能,通过监听滚动事件动态加载数据。以下是Vue中实现滚动加载的几种方案: 使用原生滚动事件监听 通过监听窗口或容器…

vue实现加载图片

vue实现加载图片

Vue 实现图片加载的方法 在 Vue 中加载图片可以通过多种方式实现,以下是一些常见的方法: 使用静态资源路径 将图片放在 public 或 assets 目录下,通过相对路径或绝对路径引用。…

vue实现无线加载

vue实现无线加载

无限滚动加载的实现 在Vue中实现无限滚动加载(Infinite Scroll)可以通过监听滚动事件或使用现成的库完成。以下是两种常见方法: 使用原生滚动事件监听 通过监听滚动事件判断是否到达页面底…