当前位置:首页 > VUE

vue 实现下拉加载

2026-02-22 18:38:14VUE

Vue 实现下拉加载的方法

使用 IntersectionObserver API

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

<template>
  <div>
    <div v-for="item in list" :key="item.id">{{ item.content }}</div>
    <div ref="loadMore"></div>
  </div>
</template>

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

使用 window.scroll 事件

通过监听滚动事件判断是否到达底部。

vue 实现下拉加载

<template>
  <div @scroll="handleScroll">
    <div v-for="item in list" :key="item.id">{{ item.content }}</div>
  </div>
</template>

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

      if (scrollTop + windowHeight >= scrollHeight - 100 && !this.isLoading) {
        this.loadData()
      }
    },
    async loadData() {
      this.isLoading = true
      const newData = await fetchData(this.page)
      this.list = [...this.list, ...newData]
      this.page++
      this.isLoading = false
    }
  }
}
</script>

使用第三方库

可以使用 vue-infinite-loading 等第三方库简化实现。

vue 实现下拉加载

安装:

npm install vue-infinite-loading

使用:

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

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

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

注意事项

  • 添加加载状态提示避免重复请求
  • 在组件销毁时移除事件监听
  • 考虑数据加载完成后的处理
  • 添加错误处理机制
  • 对于移动端需要考虑滚动性能优化

以上方法可以根据具体需求选择适合的实现方式,IntersectionObserver API 是现代浏览器推荐的方式,而第三方库可以快速实现复杂功能。

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

相关文章

vue查看更多怎么实现

vue查看更多怎么实现

实现 Vue 的“查看更多”功能 数据截取与显示控制 通过 v-if 或 v-show 控制内容的显示与隐藏。初始状态下只显示部分内容,点击“查看更多”后展开完整内容。 <template&g…

vue实现简单的弹窗

vue实现简单的弹窗

使用 Vue 实现简单弹窗 组件基础结构 创建一个名为 Modal.vue 的组件文件,包含模板、脚本和样式部分: <template> <div class="mod…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…

vue实现一个系统

vue实现一个系统

Vue 系统实现步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目: npm init vue@latest my-system 选择需要的配置(Router、Pinia 等)。…

vue 实现pc

vue 实现pc

Vue 实现 PC 端应用的核心要点 Vue.js 是一个渐进式框架,适合构建 PC 端单页应用(SPA)或复杂的前端界面。以下是实现 PC 端应用的关键方法和注意事项: 项目初始化与工程化配置 使…

实现vue模版

实现vue模版

Vue 模板的基本结构 Vue 模板基于 HTML 语法,通过 Vue 的指令和插值实现动态渲染。以下是一个基础模板示例: <template> <div id="app"…