当前位置:首页 > VUE

vue实现触底加载

2026-01-16 03:48:50VUE

触底加载的实现方法

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

监听滚动事件

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

vue实现触底加载

<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

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

vue实现触底加载

<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

使用示例:

<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. 移动端适配:需要考虑移动端的滚动行为差异

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

相关文章

vue滚动加载实现

vue滚动加载实现

vue滚动加载实现 滚动加载是一种常见的优化手段,通过监听滚动事件动态加载数据,减少初始渲染压力。以下是几种实现方式: 使用IntersectionObserver API Intersectio…

vue 实现异步加载

vue 实现异步加载

Vue 异步加载的实现方法 动态导入组件(懒加载) 使用 import() 语法动态导入组件,Vue 会将其转换为异步加载的组件。适用于路由或组件按需加载。 const AsyncComponen…

js实现图片加载

js实现图片加载

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

vue实现流加载

vue实现流加载

Vue 实现流加载(无限滚动)的方法 流加载(无限滚动)是一种常见的网页优化技术,通过动态加载数据提升用户体验。以下是几种 Vue 实现流加载的方式: 使用 v-infinite-scroll 指…

vue如何实现异步加载

vue如何实现异步加载

Vue异步加载的实现方式 动态导入组件 使用import()语法动态导入组件,Vue会将其识别为异步组件。这种方式适用于路由懒加载或按需加载组件。 const AsyncComponent = (…

vue实现路由懒加载

vue实现路由懒加载

路由懒加载的概念 路由懒加载是一种优化技术,通过将路由对应的组件拆分成独立的代码块,仅在访问该路由时才加载对应的组件代码。这种方式可以减少初始加载时间,提升应用性能。 使用动态导入语法 在Vue R…