当前位置:首页 > VUE

vue实现分页累加

2026-01-19 08:13:29VUE

Vue实现分页累加

基础思路

分页累加通常指滚动加载更多数据时,保留已加载内容并追加新数据。Vue中可通过监听滚动事件或结合第三方库实现。

核心代码实现

数据定义

data() {
  return {
    items: [],       // 已加载数据
    page: 1,         // 当前页码
    isLoading: false, // 加载状态
    hasMore: true    // 是否还有更多数据
  }
}

加载方法

vue实现分页累加

methods: {
  loadMore() {
    if (this.isLoading || !this.hasMore) return

    this.isLoading = true
    fetch(`/api/data?page=${this.page}`)
      .then(res => res.json())
      .then(newItems => {
        this.items = [...this.items, ...newItems]
        this.page++
        this.hasMore = newItems.length > 0
      })
      .finally(() => this.isLoading = false)
  }
}

滚动监听实现

模板部分

<div class="scroll-container" @scroll="handleScroll">
  <div v-for="item in items" :key="item.id">{{ item.content }}</div>
  <div v-if="isLoading">加载中...</div>
</div>

滚动处理方法

vue实现分页累加

handleScroll(e) {
  const { scrollTop, clientHeight, scrollHeight } = e.target
  const bottomReached = scrollTop + clientHeight >= scrollHeight - 100

  if (bottomReached) this.loadMore()
}

使用IntersectionObserver优化

观察器实现

mounted() {
  const observer = new IntersectionObserver((entries) => {
    if (entries[0].isIntersecting) this.loadMore()
  })

  this.$nextTick(() => {
    observer.observe(this.$refs.loadingTrigger)
  })
}

模板对应修改

<div v-for="item in items">{{ item.text }}</div>
<div ref="loadingTrigger" v-if="!isLoading && hasMore"></div>
<div v-if="isLoading">加载中...</div>

注意事项

  • 节流处理:滚动事件建议添加节流函数
  • 错误处理:网络请求需添加catch处理
  • 组件销毁时移除观察者
  • 移动端需考虑touch事件兼容性

完整示例组件

export default {
  data() {
    return {
      items: [],
      page: 1,
      isLoading: false,
      hasMore: true
    }
  },
  methods: {
    async loadMore() {
      if (this.isLoading || !this.hasMore) return

      this.isLoading = true
      try {
        const res = await fetch(`/api/data?page=${this.page}`)
        const newItems = await res.json()
        this.items.push(...newItems)
        this.hasMore = newItems.length > 0
        this.page++
      } finally {
        this.isLoading = false
      }
    }
  },
  mounted() {
    window.addEventListener('scroll', this.handleScroll)
  },
  beforeDestroy() {
    window.removeEventListener('scroll', this.handleScroll)
  }
}

标签: 分页vue
分享给朋友:

相关文章

vue循环数组实现

vue循环数组实现

vue循环数组的实现方法 在Vue中循环数组主要通过v-for指令实现,以下是几种常见用法: 基本数组循环 使用v-for指令遍历数组,可以通过(item, index)的语法获取当前项和索引值:…

vue组件传值实现分页

vue组件传值实现分页

Vue 组件传值实现分页 在Vue中实现分页功能,通常需要父子组件之间的数据传递。以下是几种常见的传值方法: 使用props和$emit 父组件通过props向子组件传递数据,子组件通过$emit向…

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…

vue实现绑卡的原理

vue实现绑卡的原理

Vue 实现绑卡的原理 Vue 实现绑卡功能通常涉及前端表单处理、数据绑定、验证以及和后端 API 的交互。以下是实现绑卡功能的核心原理和步骤: 数据绑定与表单处理 Vue 通过 v-model…

vue实现文章锚点定位

vue实现文章锚点定位

实现文章锚点定位的方法 在Vue中实现文章锚点定位可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML锚点 通过HTML的id属性和<a>标签的href属性实现锚点跳转。在V…

vue   实现单选

vue 实现单选

Vue 实现单选功能 在 Vue 中实现单选功能可以通过多种方式,以下是几种常见的方法: 使用原生 <input type="radio"> 绑定 v-model 通过 v-model…