当前位置:首页 > VUE

vue滚动加载实现

2026-01-08 07:00:35VUE

vue滚动加载实现

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

使用IntersectionObserver API

IntersectionObserver是现代浏览器提供的API,性能优于传统滚动事件监听。

// 在组件中
data() {
  return {
    observer: null,
    isLoading: false,
    items: [],
    page: 1
  }
},
mounted() {
  this.observer = new IntersectionObserver(([entry]) => {
    if (entry.isIntersecting && !this.isLoading) {
      this.loadMore()
    }
  })
  this.observer.observe(this.$refs.observerElement)
},
methods: {
  async loadMore() {
    this.isLoading = true
    const newItems = await fetchData(this.page++)
    this.items.push(...newItems)
    this.isLoading = false
  }
}

模板部分需要添加观察元素:

vue滚动加载实现

<div v-for="item in items">{{ item.content }}</div>
<div ref="observerElement" v-if="!isLoading && hasMore">Loading...</div>

使用滚动事件监听

传统方法通过计算滚动位置实现:

mounted() {
  window.addEventListener('scroll', this.handleScroll)
},
destroyed() {
  window.removeEventListener('scroll', this.handleScroll)
},
methods: {
  handleScroll() {
    const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
    const windowHeight = document.documentElement.clientHeight
    const scrollHeight = document.documentElement.scrollHeight

    if (scrollTop + windowHeight >= scrollHeight - 100 && !this.isLoading) {
      this.loadMore()
    }
  }
}

使用第三方库

vue-infinite-loading是流行的滚动加载组件:

vue滚动加载实现

安装:

npm install vue-infinite-loading

使用:

import InfiniteLoading from 'vue-infinite-loading'

export default {
  components: { InfiniteLoading },
  methods: {
    async loadMore($state) {
      try {
        const newItems = await fetchData(this.page++)
        if (newItems.length) {
          this.items.push(...newItems)
          $state.loaded()
        } else {
          $state.complete()
        }
      } catch (e) {
        $state.error()
      }
    }
  }
}

模板:

<infinite-loading @infinite="loadMore">
  <div slot="no-more">No more data</div>
  <div slot="no-results">No results</div>
</infinite-loading>

性能优化建议

  • 使用防抖函数避免频繁触发
  • 添加加载状态锁防止重复请求
  • 服务端应支持分页查询
  • 移动端考虑使用IntersectionObserver
  • 列表项添加key属性提高diff效率

以上方法可根据具体需求选择,现代浏览器推荐优先使用IntersectionObserver方案。

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

相关文章

javascript实现vue

javascript实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,主要包括数据绑定、响应式系统和虚拟 DOM。以下是一个简化的实现示例。 数据响应式系统 通过 Object.de…

利用vue 实现

利用vue 实现

以下是利用 Vue 实现常见功能的几种方法,分为不同场景和技术要点: 数据绑定与响应式更新 Vue 的核心特性是数据绑定,通过 v-model 实现双向绑定: <template>…

vue实现flbook

vue实现flbook

Vue 实现类似 Flbook 的翻页效果 要实现类似 Flbook 的翻页效果,可以使用 Vue 结合 CSS 动画和 JavaScript 事件处理。以下是实现方法: 安装依赖 需要安装 vue…

vue实现抽屉

vue实现抽屉

Vue 实现抽屉组件 抽屉组件是一种常见的 UI 模式,通常用于从屏幕边缘滑出内容。以下是几种实现抽屉的方法: 使用 Vue 原生实现 创建一个基本的抽屉组件,利用 Vue 的过渡和条件渲染功能。…

vue实现侧导航

vue实现侧导航

Vue 实现侧边导航 使用 Vue 实现侧边导航可以通过多种方式完成,以下是一种常见的实现方法,结合 Vue Router 和动态组件。 基础结构 创建侧边导航栏的基本结构,通常使用 <ul&…

vue实现抽奖轮盘

vue实现抽奖轮盘

实现抽奖轮盘的基本思路 使用Vue实现抽奖轮盘的核心在于动态旋转动画和结果判定。通常需要结合CSS动画或JavaScript动画库(如GSAP)控制轮盘的旋转角度,并通过随机数或后端接口确定最终奖项。…