当前位置:首页 > VUE

vue实现下拉刷新组件

2026-01-07 06:05:30VUE

实现下拉刷新组件的核心思路

下拉刷新功能通常通过监听触摸事件、滚动位置和动画效果实现。Vue中可以利用自定义指令或封装组件完成,以下为两种常见实现方式。

基于自定义指令的实现

创建指令监听触摸事件,计算下拉距离并触发回调:

Vue.directive('pull-to-refresh', {
  bind(el, binding) {
    let startY = 0
    let currentY = 0
    const refreshHeight = 50

    el.addEventListener('touchstart', e => {
      startY = e.touches[0].pageY
    }, { passive: true })

    el.addEventListener('touchmove', e => {
      currentY = e.touches[0].pageY
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop

      if (scrollTop === 0 && currentY - startY > 0) {
        e.preventDefault()
        const distance = Math.min(currentY - startY, refreshHeight * 3)
        binding.value(distance / refreshHeight)
      }
    }, { passive: false })

    el.addEventListener('touchend', () => {
      if ((currentY - startY) > refreshHeight) {
        binding.value('refresh')
      } else {
        binding.value(0)
      }
    }, { passive: true })
  }
})

使用方式:

<div v-pull-to-refresh="handleRefresh">
  <!-- 内容区域 -->
</div>

封装可复用组件方案

创建独立组件处理所有交互逻辑:

<template>
  <div class="refresh-container" @touchstart="onTouchStart" @touchmove="onTouchMove" @touchend="onTouchEnd">
    <div class="refresh-control" :style="{ transform: `translateY(${pullDistance}px)` }">
      <slot name="loading" v-if="isRefreshing">
        <!-- 自定义加载中状态 -->
      </slot>
      <slot name="pull" v-else>
        <!-- 自定义下拉提示 -->
      </slot>
    </div>
    <slot></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startY: 0,
      currentY: 0,
      pullDistance: 0,
      isRefreshing: false,
      maxPullDistance: 70
    }
  },
  methods: {
    onTouchStart(e) {
      if (this.isRefreshing) return
      this.startY = e.touches[0].pageY
    },
    onTouchMove(e) {
      if (this.isRefreshing) return
      this.currentY = e.touches[0].pageY
      const scrollTop = document.documentElement.scrollTop

      if (scrollTop === 0 && this.currentY - this.startY > 0) {
        this.pullDistance = Math.min(
          this.currentY - this.startY,
          this.maxPullDistance
        )
      }
    },
    onTouchEnd() {
      if (this.pullDistance > this.maxPullDistance * 0.6) {
        this.isRefreshing = true
        this.$emit('refresh')
      } else {
        this.pullDistance = 0
      }
    },
    finishRefresh() {
      this.isRefreshing = false
      this.pullDistance = 0
    }
  }
}
</script>

<style>
.refresh-container {
  position: relative;
}
.refresh-control {
  position: absolute;
  width: 100%;
  top: 0;
  left: 0;
  transition: transform 0.3s ease;
}
</style>

第三方库推荐方案

  1. vue-pull-refresh
    安装:

    vue实现下拉刷新组件

    npm install vue-pull-refresh

    使用示例:

    <template>
      <pull-refresh @refresh="onRefresh">
        <!-- 内容区域 -->
      </pull-refresh>
    </template>
    
    <script>
    import PullRefresh from 'vue-pull-refresh'
    
    export default {
      components: { PullRefresh },
      methods: {
        onRefresh(done) {
          fetchData().then(() => done())
        }
      }
    }
    </script>
  2. mescroll.js
    支持下拉刷新和上拉加载的完整解决方案:

    <template>
      <mescroll-vue ref="mescroll" @down="downCallback" @up="upCallback">
        <!-- 内容列表 -->
      </mescroll-vue>
    </template>

性能优化要点

  • 使用CSS will-change属性提升动画性能:

    vue实现下拉刷新组件

    .refresh-control {
      will-change: transform;
    }
  • 避免频繁的DOM操作,使用transform代替top定位

  • 添加防抖处理快速连续触发

  • 移动端注意passive事件监听器的使用

标签: 组件vue
分享给朋友:

相关文章

vue实现triger

vue实现triger

在Vue中实现触发器(trigger)功能通常涉及自定义事件或DOM事件触发。以下是几种常见场景的实现方法: 自定义事件触发 通过$emit方法触发父组件中监听的自定义事件: // 子组件 thi…

vue 实现过滤

vue 实现过滤

Vue 实现过滤的方法 在 Vue 中实现过滤功能可以通过多种方式完成,包括使用计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法: 使用计算属性进行过滤 计算属性是 Vue 中最常用的过…

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。ite…

jquery实现vue

jquery实现vue

jQuery 和 Vue.js 是两种不同理念的前端工具,jQuery 以 DOM 操作和事件驱动为核心,而 Vue.js 是数据驱动的现代化框架。如果想用 jQuery 实现类似 Vue 的功能(如…

vue实现京东

vue实现京东

Vue 实现京东电商网站的关键步骤 项目搭建与基础配置 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 管理路由,Vuex/Pinia 管理状态。配置基础 UI 框架如 E…

vue toast实现

vue toast实现

Vue Toast 实现方法 使用第三方库(推荐) 安装 vue-toastification 库,这是一个功能丰富且轻量级的 Vue Toast 插件。 npm install vue-toas…