当前位置:首页 > VUE

vue下拉刷新实现

2026-03-08 08:50:09VUE

Vue 下拉刷新实现方法

使用第三方库(推荐)

安装 vue-pull-refreshmescroll.js 等专门为 Vue 设计的插件,这些库提供开箱即用的下拉刷新功能,支持自定义样式和回调函数。

// 以 vue-pull-refresh 为例
npm install vue-pull-refresh --save

// 组件中使用
<template>
  <pull-refresh :on-refresh="onRefresh">
    <!-- 列表内容 -->
  </pull-refresh>
</template>

<script>
import PullRefresh from 'vue-pull-refresh';
export default {
  components: { PullRefresh },
  methods: {
    onRefresh() {
      return new Promise((resolve) => {
        setTimeout(() => {
          // 刷新数据逻辑
          resolve();
        }, 1000);
      });
    }
  }
}
</script>

原生实现方案

通过监听 touchstarttouchmovetouchend 事件手动计算滑动距离,结合 CSS 过渡动画实现效果。

<template>
  <div class="refresh-container" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd">
    <div class="refresh-control" :style="{ transform: `translateY(${offsetY}px)` }">
      <span v-if="!isLoading">下拉刷新</span>
      <span v-else>加载中...</span>
    </div>
    <div class="content">
      <!-- 列表内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startY: 0,
      offsetY: 0,
      isLoading: false
    };
  },
  methods: {
    touchStart(e) {
      this.startY = e.touches[0].pageY;
    },
    touchMove(e) {
      const moveY = e.touches[0].pageY - this.startY;
      if (moveY > 0 && window.scrollY <= 0) {
        this.offsetY = Math.min(moveY, 100);
        e.preventDefault();
      }
    },
    touchEnd() {
      if (this.offsetY > 60 && !this.isLoading) {
        this.isLoading = true;
        this.onRefresh().finally(() => {
          this.isLoading = false;
          this.offsetY = 0;
        });
      } else {
        this.offsetY = 0;
      }
    },
    onRefresh() {
      return new Promise(resolve => {
        // 模拟异步请求
        setTimeout(resolve, 1500);
      });
    }
  }
}
</script>

<style>
.refresh-container {
  position: relative;
  overflow: hidden;
}
.refresh-control {
  position: absolute;
  width: 100%;
  height: 60px;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: transform 0.3s;
}
</style>

结合 Better-Scroll 实现

Better-Scroll 提供更流畅的滚动体验,内置下拉刷新功能。

vue下拉刷新实现

npm install better-scroll --save

// 组件中使用
<template>
  <div ref="wrapper" class="wrapper">
    <div class="content">
      <div class="refresh-tip">{{ refreshText }}</div>
      <!-- 列表内容 -->
    </div>
  </div>
</template>

<script>
import BScroll from 'better-scroll';
export default {
  data() {
    return {
      scroll: null,
      refreshText: '下拉刷新'
    };
  },
  mounted() {
    this.initScroll();
  },
  methods: {
    initScroll() {
      this.scroll = new BScroll(this.$refs.wrapper, {
        pullDownRefresh: {
          threshold: 50,
          stop: 40
        },
        click: true
      });

      this.scroll.on('pullingDown', () => {
        this.refreshText = '释放刷新';
      });

      this.scroll.on('scroll', (pos) => {
        if (pos.y > 50) {
          this.refreshText = '下拉刷新';
        }
      });

      this.scroll.on('scrollEnd', () => {
        if (this.scroll.y <= -50 && this.refreshText === '释放刷新') {
          this.refreshData();
        }
      });
    },
    refreshData() {
      this.refreshText = '加载中...';
      setTimeout(() => {
        // 数据更新逻辑
        this.scroll.finishPullDown();
        this.refreshText = '下拉刷新';
      }, 1500);
    }
  }
}
</script>

注意事项

  • 移动端需要添加 touch-action: none 防止浏览器默认行为冲突
  • 下拉距离阈值建议设置为 60-100px 触发刷新
  • 加载中状态需显示明确反馈(如旋转图标)
  • onRefresh 完成后必须调用恢复方法(如 resolve()finishPullDown()

标签: vue
分享给朋友:

相关文章

vue如何实现注册

vue如何实现注册

实现用户注册功能 在Vue中实现注册功能通常需要结合前端表单和后端API交互。以下是完整的实现方案: 创建注册表单组件 注册表单需要包含用户名、邮箱、密码等基本字段,并进行表单验证: <te…

vue实现安全免登录

vue实现安全免登录

Vue 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Token…

vue页面实现

vue页面实现

Vue 页面实现方法 创建 Vue 组件 使用 Vue 单文件组件(SFC)方式创建页面,文件扩展名为 .vue。一个基本的 Vue 组件包含三个部分:模板(template)、脚本(script)和…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…

vue环境实现

vue环境实现

Vue 环境搭建 安装 Node.js 和 npm Node.js 是运行 Vue 的基础环境,npm 是包管理工具。从 Node.js 官网 下载并安装最新稳定版本。安装完成后,在终端运行以下命令验…

vue核心实现

vue核心实现

Vue 核心实现原理 Vue.js 的核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键实现原理的详细说明: 响应式系统 Vue 使用 Object.defineProper…