当前位置:首页 > VUE

vue实现下拉刷新组件

2026-01-12 07:27:08VUE

Vue 下拉刷新组件实现

核心思路
通过监听 touch 事件计算滑动距离,结合 CSS 过渡动画实现下拉效果,触发刷新回调。

基础实现步骤

监听 touch 事件
在组件 mounted 阶段绑定 touchstart/touchmove/touchend 事件:

mounted() {
  this.$el.addEventListener('touchstart', this.handleTouchStart)
  this.$el.addEventListener('touchmove', this.handleTouchMove)
  this.$el.addEventListener('touchend', this.handleTouchEnd)
}

计算滑动距离
记录初始 Y 坐标,计算移动距离:

handleTouchStart(e) {
  this.startY = e.touches[0].pageY
}

handleTouchMove(e) {
  const currentY = e.touches[0].pageY
  this.distance = currentY - this.startY
  if (this.distance > 0) {
    e.preventDefault()
  }
}

状态控制
根据距离切换不同状态:

data() {
  return {
    state: 'waiting', // waiting/pulling/loading
    distance: 0,
    startY: 0
  }
}

动画效果实现

CSS 过渡样式
为下拉区域添加平滑过渡:

.pull-refresh {
  transition: transform 0.3s ease;
}

动态位移计算
根据距离动态设置 transform:

get transformStyle() {
  return `translateY(${this.distance}px)`
}

阈值判断
设置触发刷新的最小距离(通常 50-80px):

handleTouchEnd() {
  if (this.distance > 80) {
    this.state = 'loading'
    this.$emit('refresh')
  } else {
    this.reset()
  }
}

完整组件示例

模板结构

<template>
  <div class="pull-refresh" :style="transformStyle">
    <div class="refresh-head">
      <span v-if="state === 'loading'">加载中...</span>
      <span v-else>下拉刷新</span>
    </div>
    <slot></slot>
  </div>
</template>

状态重置方法

methods: {
  reset() {
    this.distance = 0
    this.state = 'waiting'
  },
  finishRefresh() {
    this.reset()
  }
}

优化方向

节流处理
避免 touchmove 事件高频触发:

handleTouchMove: _.throttle(function(e) {
  // 计算逻辑
}, 16)

自定义插槽
支持自定义加载动画和提示文案:

<template v-slot:loading>
  <custom-spinner />
</template>

弹性效果
实现越界回弹的物理效果:

if (this.distance > 100) {
  this.distance = 100 + (this.distance - 100) * 0.5
}

第三方库推荐

  1. mescroll.js
    支持 Vue 的完整下拉刷新/上拉加载解决方案

  2. vue-pull-refresh
    轻量级组件,支持自定义动画

  3. vant-ui PullRefresh
    有赞团队开发的成熟组件

    vue实现下拉刷新组件

实现时需注意移动端事件兼容性和性能优化,建议使用 passive event listeners 提升滚动性能。

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

相关文章

vue实现录音文件播放

vue实现录音文件播放

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

vue实现双折线图

vue实现双折线图

实现双折线图的步骤 安装必要的依赖库(如 ECharts 或 Chart.js),这里以 ECharts 为例: npm install echarts --save 在 Vue 组件中引入 ECh…

vue实现星星

vue实现星星

实现星星评分的Vue组件 使用Vue实现星星评分功能可以通过组件化方式完成,以下是一个完整的实现方案: 模板部分 <template> <div class="star-ra…

vue实现弹窗

vue实现弹窗

Vue 实现弹窗的常见方法 使用组件化方式封装弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏: <template> <…

vue 实现grid

vue 实现grid

在Vue中实现Grid布局可以通过多种方式完成,以下是几种常见的方法: 使用CSS Grid布局 CSS Grid是一种强大的布局系统,可以直接在Vue组件的样式中使用。以下是一个简单的示例:…

vue实现图册

vue实现图册

Vue实现图册功能 在Vue中实现图册功能通常涉及图片展示、切换、缩放等交互效果。以下是常见的实现方法和关键代码示例: 基础图册组件结构 使用Vue单文件组件构建基础结构: <templat…