当前位置:首页 > VUE

vue实现滑动加载

2026-03-08 19:32:09VUE

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.loadItems()
        }
      })
      observer.observe(this.$refs.loader)
    },
    async loadItems() {
      this.isLoading = true
      const newItems = await fetch(`/api/items?page=${this.page}`).then(res => res.json())
      this.items = [...this.items, ...newItems]
      this.page++
      this.isLoading = false
    }
  }
}
</script>

使用窗口滚动事件

通过监听窗口滚动事件计算是否到达底部。

vue实现滑动加载

<template>
  <div>
    <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() {
    window.addEventListener('scroll', this.handleScroll)
    this.loadItems()
  },
  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.loadItems()
      }
    },
    async loadItems() {
      this.isLoading = true
      const newItems = await fetch(`/api/items?page=${this.page}`).then(res => res.json())
      this.items = [...this.items, ...newItems]
      this.page++
      this.isLoading = false
    }
  }
}
</script>

使用第三方库

可以使用 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="loadItems"></infinite-loading>
  </div>
</template>

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

export default {
  components: { InfiniteLoading },
  data() {
    return {
      items: [],
      page: 1
    }
  },
  methods: {
    async loadItems($state) {
      try {
        const newItems = await fetch(`/api/items?page=${this.page}`).then(res => res.json())
        if (newItems.length) {
          this.items = [...this.items, ...newItems]
          this.page++
          $state.loaded()
        } else {
          $state.complete()
        }
      } catch (error) {
        $state.error()
      }
    }
  }
}
</script>

性能优化建议

  • 使用防抖或节流控制滚动事件触发频率
  • 添加加载状态提示和错误处理
  • 在组件销毁时移除事件监听
  • 考虑使用虚拟滚动处理大量数据

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

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

相关文章

vue实现下拉框删除

vue实现下拉框删除

Vue 实现下拉框删除功能 在Vue中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、Go…

ssh vue 实现

ssh vue 实现

使用SSH连接Vue项目部署的服务器 在Vue项目开发或部署过程中,可能需要通过SSH连接到远程服务器进行配置或维护。以下是实现SSH连接并部署Vue项目的关键步骤: 生成SSH密钥对 在本地终端运…

vue实现list

vue实现list

Vue 实现列表渲染 在 Vue 中,可以使用 v-for 指令来渲染列表。v-for 指令基于一个数组或对象来渲染一个列表,可以遍历数组或对象的属性。 基本列表渲染 <template>…

vue实现选人

vue实现选人

实现选人功能的基本思路 在Vue中实现选人功能通常涉及以下核心环节:数据绑定、用户交互处理、状态管理以及界面渲染。以下是具体实现方法: 数据准备与组件结构 创建包含人员信息的数组,通常从API获取或…

vue 实现templateurl

vue 实现templateurl

在 Vue 中,templateUrl 是 Angular 中的一个概念,用于指定外部 HTML 文件作为模板。Vue 本身不直接支持 templateUrl,但可以通过以下方法实现类似功能: 使用…