当前位置:首页 > VUE

vue实现下拉刷新

2026-02-24 06:06:13VUE

Vue 实现下拉刷新功能

使用第三方库(推荐)

安装 vue-pull-refresh 库:

npm install vue-pull-refresh --save

在组件中引入并使用:

<template>
  <pull-to-refresh
    :top-load-method="refreshData"
    @top-state-change="stateChange"
  >
    <!-- 你的列表内容 -->
    <div v-for="item in list" :key="item.id">{{ item.text }}</div>
  </pull-to-refresh>
</template>

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

export default {
  components: {
    PullToRefresh
  },
  data() {
    return {
      list: []
    }
  },
  methods: {
    refreshData(loaded) {
      // 模拟异步请求
      setTimeout(() => {
        // 更新数据
        this.list = [...newData]
        // 调用loaded表示加载完成
        loaded('done')
      }, 1000)
    },
    stateChange(state) {
      console.log('当前状态:', state)
    }
  }
}
</script>

原生实现方案

监听 touch 事件实现基础下拉刷新:

<template>
  <div 
    class="pull-refresh"
    @touchstart="handleTouchStart"
    @touchmove="handleTouchMove"
    @touchend="handleTouchEnd"
  >
    <div class="refresh-tip" :style="{ height: pullHeight + 'px' }">
      {{ refreshText }}
    </div>
    <slot></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startY: 0,
      currentY: 0,
      pullHeight: 0,
      isRefreshing: false,
      maxPullHeight: 100
    }
  },
  computed: {
    refreshText() {
      if (this.isRefreshing) return '加载中...'
      return this.pullHeight > 50 ? '释放刷新' : '下拉刷新'
    }
  },
  methods: {
    handleTouchStart(e) {
      this.startY = e.touches[0].pageY
    },
    handleTouchMove(e) {
      if (this.isRefreshing) return

      this.currentY = e.touches[0].pageY
      const distance = this.currentY - this.startY

      if (distance > 0 && window.scrollY <= 0) {
        e.preventDefault()
        this.pullHeight = Math.min(distance, this.maxPullHeight)
      }
    },
    handleTouchEnd() {
      if (this.isRefreshing) return

      if (this.pullHeight > 50) {
        this.isRefreshing = true
        this.$emit('refresh', () => {
          this.isRefreshing = false
          this.pullHeight = 0
        })
      } else {
        this.pullHeight = 0
      }
    }
  }
}
</script>

<style>
.pull-refresh {
  position: relative;
}
.refresh-tip {
  position: absolute;
  width: 100%;
  top: -100px;
  display: flex;
  justify-content: center;
  align-items: flex-end;
}
</style>

结合 better-scroll 实现

安装 better-scroll:

npm install better-scroll --save

实现代码:

vue实现下拉刷新

<template>
  <div ref="wrapper" class="wrapper">
    <div class="pull-down-refresh">
      <div class="refresh-tip">
        {{ pullDownRefreshText }}
      </div>
      <slot></slot>
    </div>
  </div>
</template>

<script>
import BScroll from 'better-scroll'

export default {
  data() {
    return {
      scroll: null,
      pullDownRefreshText: '下拉刷新'
    }
  },
  mounted() {
    this.initScroll()
  },
  methods: {
    initScroll() {
      this.scroll = new BScroll(this.$refs.wrapper, {
        pullDownRefresh: {
          threshold: 50,
          stop: 40
        },
        click: true
      })

      this.scroll.on('pullingDown', () => {
        this.pullDownRefreshText = '正在刷新...'
        this.$emit('refresh', () => {
          this.finishPullDown()
        })
      })

      this.scroll.on('scroll', (pos) => {
        if (pos.y > 50) {
          this.pullDownRefreshText = '释放刷新'
        } else {
          this.pullDownRefreshText = '下拉刷新'
        }
      })
    },
    finishPullDown() {
      this.scroll.finishPullDown()
      this.scroll.refresh()
      this.pullDownRefreshText = '下拉刷新'
    }
  }
}
</script>

注意事项

  • 移动端需要添加 touch 事件监听
  • 下拉刷新时应该阻止页面默认滚动行为
  • 刷新完成后需要重置状态
  • 性能优化:使用 requestAnimationFrame 优化滚动效果
  • 在组件销毁时移除事件监听

标签: vue
分享给朋友:

相关文章

vue实现单选

vue实现单选

Vue 实现单选功能 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 绑定一个变量,可以实现单选功能。单选按钮的 v…

vue使用vr实现标注

vue使用vr实现标注

Vue 中使用 VR 实现标注的方法 在 Vue 项目中结合 VR 技术实现标注功能,可以通过 WebXR 和 Three.js 等库实现。以下为具体实现方法: 安装依赖 确保项目中已安装 Thre…

vue实现suspense

vue实现suspense

Vue 3 中实现 Suspense Suspense 是 Vue 3 引入的一个内置组件,用于处理异步依赖的加载状态。它允许在等待异步组件或异步数据加载时显示一个后备内容(fallback),直到异…

vue实现表白

vue实现表白

Vue 实现表白页面 使用 Vue 可以快速创建一个动态、交互式的表白页面。以下是一个简单的实现方案: 基础结构 创建一个 Vue 项目或单文件组件,包含以下核心部分: <template&…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…

vue实现Siri

vue实现Siri

Vue 实现 Siri 风格语音交互 实现类似 Siri 的语音交互功能需要结合语音识别、语音合成和前端交互逻辑。Vue 作为前端框架,可以很好地管理这些功能的交互状态。 语音识别集成 使用 Web…