当前位置:首页 > 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):

vue实现下拉刷新组件

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)

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

vue实现下拉刷新组件

<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
    有赞团队开发的成熟组件

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

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

相关文章

vue手动实现弹窗

vue手动实现弹窗

实现弹窗组件的基本结构 在Vue中手动实现弹窗组件,需要创建一个独立的弹窗组件,并通过props控制其显示与隐藏。弹窗组件通常包含遮罩层、内容区域和关闭按钮。 <template>…

vue查看更多怎么实现

vue查看更多怎么实现

实现 Vue 的“查看更多”功能 数据截取与显示控制 通过 v-if 或 v-show 控制内容的显示与隐藏。初始状态下只显示部分内容,点击“查看更多”后展开完整内容。 <template&g…

vue弹幕实现不重叠

vue弹幕实现不重叠

实现 Vue 弹幕不重叠的方法 CSS 定位与动画控制 通过绝对定位和动态计算弹幕轨道高度,确保弹幕在不同轨道上运行。每条弹幕占据固定高度的轨道,避免重叠。 // 弹幕轨道高度计算 const tr…

vue实现活动倒计时

vue实现活动倒计时

实现活动倒计时的基本思路 在Vue中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的d…

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登录…

vue里实现增删改查

vue里实现增删改查

在Vue中实现增删改查 数据初始化 在Vue组件的data中定义初始数据和表单绑定的变量: data() { return { items: [ { id: 1, name…