当前位置:首页 > 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 的核心功能包括数据响应式、模板编译和虚拟 DOM。以下是一个简易实现方案,涵盖核心功能模块。 数据响应式系统 通过 Object.defineProperty…

computed vue 实现

computed vue 实现

computed 在 Vue 中的基本用法 Vue 的 computed 属性用于声明依赖于其他数据的计算属性。当依赖的数据变化时,计算属性会自动重新计算并缓存结果。 export defaul…

vue 实现拖动

vue 实现拖动

Vue 实现拖动的几种方法 在Vue中实现拖动功能可以通过多种方式,包括原生HTML5的拖放API、第三方库如vuedraggable等。以下是几种常见的实现方法: 使用HTML5拖放API HTM…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…

vue实现123456

vue实现123456

Vue 实现数字 123456 的显示 在 Vue 中显示数字 123456 非常简单,可以通过以下方法实现: 方法一:直接在模板中显示 <template> <div>…

vue mvvm 实现

vue mvvm 实现

Vue MVVM 实现原理 Vue.js 的 MVVM(Model-View-ViewModel)架构通过数据绑定和响应式系统实现视图与数据的自动同步。以下是其核心实现机制: 数据劫持与响应式系统…