当前位置:首页 > 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实现全景

vue实现全景

Vue 实现全景效果的方法 使用 Vue 实现全景效果通常需要结合第三方库或框架,以下是几种常见的方法: 使用 Three.js 和 Vue-Three.js Three.js 是一个强大的 3D…

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过drag…

vue实现swiper

vue实现swiper

Vue 中实现 Swiper 的方法 安装 Swiper 依赖 在 Vue 项目中安装 Swiper 和相关依赖: npm install swiper vue-awesome-swiper 全局引…

vue实现listview

vue实现listview

Vue 实现 ListView 的方法 基础列表渲染 使用 v-for 指令可以轻松实现基础列表渲染。在 Vue 中,v-for 用于遍历数组或对象,生成动态列表。 <template>…

vue实现gridlayout

vue实现gridlayout

Vue 实现 Grid Layout 使用 CSS Grid 布局 CSS Grid 是一种强大的布局系统,可以直接在 Vue 组件的样式中使用。通过定义网格容器和网格项,可以快速实现复杂的布局结构。…

vue下载实现

vue下载实现

Vue 下载实现方法 在 Vue 项目中实现文件下载功能可以通过多种方式完成,以下是几种常见的方法: 使用 <a> 标签实现下载 通过动态创建 <a> 标签并设置 href…