当前位置:首页 > VUE

vue实现上拉分页

2026-01-22 03:43:01VUE

Vue 实现上拉分页的方法

使用第三方库(如 better-scroll)

安装 better-scroll 库:

npm install better-scroll --save

在 Vue 组件中引入并初始化:

import BScroll from 'better-scroll'

export default {
  data() {
    return {
      page: 1,
      pageSize: 10,
      list: [],
      loading: false,
      finished: false,
      scroll: null
    }
  },
  mounted() {
    this.initScroll()
    this.loadData()
  },
  methods: {
    initScroll() {
      this.scroll = new BScroll(this.$refs.wrapper, {
        pullUpLoad: true,
        click: true
      })
      this.scroll.on('pullingUp', this.loadMore)
    },
    loadData() {
      // 模拟异步请求
      setTimeout(() => {
        const newData = this.getMockData(this.page, this.pageSize)
        this.list = [...this.list, ...newData]
        this.loading = false
        this.scroll.finishPullUp()
        this.scroll.refresh()
      }, 500)
    },
    loadMore() {
      if (this.finished || this.loading) return
      this.loading = true
      this.page++
      this.loadData()
    },
    getMockData(page, size) {
      // 模拟数据
      return Array.from({length: size}, (_, i) => ({
        id: (page - 1) * size + i + 1,
        text: `Item ${(page - 1) * size + i + 1}`
      }))
    }
  }
}

使用原生滚动事件监听

export default {
  data() {
    return {
      page: 1,
      pageSize: 10,
      list: [],
      loading: false,
      finished: false
    }
  },
  mounted() {
    window.addEventListener('scroll', this.handleScroll)
    this.loadData()
  },
  beforeDestroy() {
    window.removeEventListener('scroll', this.handleScroll)
  },
  methods: {
    handleScroll() {
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
      const windowHeight = document.documentElement.clientHeight || document.body.clientHeight
      const scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight

      if (scrollTop + windowHeight >= scrollHeight - 50 && !this.loading && !this.finished) {
        this.loadMore()
      }
    },
    loadData() {
      this.loading = true
      setTimeout(() => {
        const newData = this.getMockData(this.page, this.pageSize)
        this.list = [...this.list, ...newData]
        this.loading = false
      }, 500)
    },
    loadMore() {
      this.page++
      this.loadData()
    }
  }
}

使用 Vue 自定义指令

创建自定义指令:

Vue.directive('loadmore', {
  bind(el, binding) {
    const selectWrap = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap')
    selectWrap.addEventListener('scroll', function() {
      const condition = this.scrollHeight - this.scrollTop <= this.clientHeight
      if (condition) {
        binding.value()
      }
    })
  }
})

在组件中使用:

vue实现上拉分页

<template>
  <div v-loadmore="loadMore">
    <!-- 内容 -->
  </div>
</template>

注意事项

  • 需要处理加载状态,避免重复请求
  • 列表数据为空时显示提示信息
  • 滚动事件需要节流处理
  • 组件销毁时需要移除事件监听
  • 分页接口需要返回是否还有更多数据的标识

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

相关文章

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue.js设…

vue使用vr实现标注

vue使用vr实现标注

Vue 中使用 VR 实现标注的方法 在 Vue 项目中结合 VR 技术实现标注功能,可以通过 WebXR 和 Three.js 等库实现。以下为具体实现方法: 安装依赖 确保项目中已安装 Thre…

vue实现录音文件播放

vue实现录音文件播放

使用 Vue 实现录音文件播放 准备工作 确保项目中已安装必要的依赖,如 vue-audio-recorder 或原生 Web Audio API。录音文件播放通常涉及录音、存储和播放三个核心环节。…

vue实现注销

vue实现注销

实现用户注销功能 在Vue应用中实现用户注销功能通常涉及清除用户会话、重置应用状态并跳转到登录页面。以下是具体实现方法: 清除用户认证信息 使用Vuex或Pinia管理用户状态时,需在注销时重置存储…

vue实现选择

vue实现选择

Vue 实现选择功能的方法 在 Vue 中实现选择功能可以通过多种方式完成,以下介绍几种常见的实现方法。 使用 v-model 绑定单选 通过 v-model 可以轻松实现单选功能。以下是一个简单的…

vue实现webshell

vue实现webshell

Vue 实现 WebShell 使用 Vue 实现 WebShell 需要结合前端与后端的交互,通常通过 WebSocket 或 HTTP 协议与服务器通信。以下是一个基于 Vue 和 WebSock…