当前位置:首页 > VUE

vue实现下拉刷新组件

2026-03-27 05:31:49VUE

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

使用Vue实现下拉刷新功能需要结合触摸事件监听、滚动位置判断和动画反馈。以下是两种常见实现方式:

基于原生事件监听的方式

注册touchstarttouchmovetouchend事件监听器,计算手指滑动距离:

<template>
  <div class="pull-refresh" @touchstart="onTouchStart" @touchmove="onTouchMove" @touchend="onTouchEnd">
    <div class="refresh-head" :style="{ transform: `translateY(${translateY}px)` }">
      <span v-if="!isLoading">{{ statusText }}</span>
      <spinner v-else />
    </div>
    <slot></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startY: 0,
      translateY: 0,
      isLoading: false,
      statusText: '下拉刷新'
    }
  },
  methods: {
    onTouchStart(e) {
      this.startY = e.touches[0].pageY
    },
    onTouchMove(e) {
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
      if (scrollTop > 0) return

      const deltaY = e.touches[0].pageY - this.startY
      if (deltaY > 0) {
        this.translateY = Math.min(deltaY, 100)
        this.statusText = deltaY > 50 ? '释放刷新' : '下拉刷新'
      }
    },
    onTouchEnd() {
      if (this.translateY > 50) {
        this.isLoading = true
        this.statusText = '加载中...'
        this.$emit('refresh', this.onRefreshDone)
      } else {
        this.translateY = 0
      }
    },
    onRefreshDone() {
      this.isLoading = false
      this.translateY = 0
    }
  }
}
</script>

使用第三方库简化实现

安装vue-pull-refresh等现成组件库:

npm install vue-pull-refresh --save

基础使用示例:

<template>
  <pull-refresh :on-refresh="onRefresh">
    <div>页面内容...</div>
  </pull-refresh>
</template>

<script>
import PullRefresh from 'vue-pull-refresh'

export default {
  components: {
    PullRefresh
  },
  methods: {
    onRefresh() {
      return new Promise(resolve => {
        setTimeout(() => {
          resolve()
        }, 1000)
      })
    }
  }
}
</script>

样式与动画优化

添加CSS过渡效果提升用户体验:

vue实现下拉刷新组件

.pull-refresh {
  position: relative;
  overflow: hidden;
}

.refresh-head {
  position: absolute;
  width: 100%;
  height: 50px;
  display: flex;
  align-items: center;
  justify-content: center;
  transform: translateY(-100%);
  transition: transform 0.3s ease;
}

.spinner {
  animation: spin 1s linear infinite;
}

@keyframes spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

注意事项

  1. 移动端需要添加touch-action样式防止默认行为冲突
  2. 滚动容器需设置正确的overflow属性
  3. 刷新完成后需要手动调用完成回调
  4. 考虑边界情况如快速滑动时的惯性处理
  5. 在SSR场景下需要判断客户端环境再注册事件

以上实现可根据具体项目需求调整阈值、动画效果和状态提示文案。

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

相关文章

实现vue datepicker

实现vue datepicker

安装依赖 使用 vue-datepicker 或第三方库如 v-calendar 或 vue2-datepicker。以 vue2-datepicker 为例: npm install vue2…

vue实现弹幕

vue实现弹幕

Vue 实现弹幕功能 弹幕功能通常包括动态生成、滚动显示、颜色和速度随机化等特性。以下是基于 Vue 3 的实现方法。 核心思路 使用 CSS 动画控制弹幕从右向左滚动。 动态生成弹幕数据,随机设置…

vue实现github

vue实现github

Vue 实现 GitHub 相关功能 创建 GitHub API 请求 在 Vue 项目中,可以使用 axios 或 fetch 与 GitHub API 进行交互。需要在 GitHub 上创建个人访…

vue实现监控

vue实现监控

Vue 实现监控功能的方法 在 Vue 中实现监控功能通常涉及数据变化监听、事件监听或第三方监控工具集成。以下是几种常见实现方式: 使用 Vue 的 watch 监听数据变化 通过 watch 可以…

vue实现左右菜单联动实现

vue实现左右菜单联动实现

Vue 实现左右菜单联动 使用事件总线通信 在 Vue 中可以通过事件总线实现左右菜单的通信。创建一个中央事件总线实例,让左右菜单通过事件监听和触发实现联动。 // eventBus.js impo…

vue实现拖拽实现组件嵌套

vue实现拖拽实现组件嵌套

Vue 拖拽实现组件嵌套 使用 Vue 实现拖拽组件嵌套功能可以通过原生 HTML5 拖拽 API 或第三方库如 vuedraggable 实现。以下是两种方法的详细说明: 使用 HTML5 拖拽…