当前位置:首页 > VUE

vue下拉刷新实现

2026-01-15 06:07:32VUE

使用第三方库实现下拉刷新

在Vue项目中,可以借助第三方库如vue-pull-refreshmescroll.js快速实现下拉刷新功能。这些库封装了手势检测和动画效果,只需简单配置即可使用。

安装vue-pull-refresh

npm install vue-pull-refresh --save

示例代码:

vue下拉刷新实现

<template>
  <pull-refresh :on-refresh="onRefresh">
    <!-- 列表内容 -->
    <div v-for="item in list" :key="item.id">{{ item.text }}</div>
  </pull-refresh>
</template>

<script>
import PullRefresh from 'vue-pull-refresh';
export default {
  components: { PullRefresh },
  data() {
    return { list: [] };
  },
  methods: {
    onRefresh() {
      return new Promise(resolve => {
        setTimeout(() => {
          this.list = [...newData]; // 模拟数据更新
          resolve();
        }, 1000);
      });
    }
  }
};
</script>

自定义实现下拉刷新

若需完全自定义,可通过监听触摸事件和滚动位置实现核心逻辑:

  1. 监听触摸事件
    在模板中绑定touchstarttouchmovetouchend事件:

    vue下拉刷新实现

    <div 
    @touchstart="handleTouchStart"
    @touchmove="handleTouchMove"
    @touchend="handleTouchEnd"
    >
    <div class="refresh-indicator" :style="{ transform: `translateY(${pullDistance}px)` }">
     {{ refreshStatus }}
    </div>
    <slot></slot>
    </div>
  2. 计算下拉距离
    通过比较触摸位置的变化计算下拉距离:

    data() {
    return {
     startY: 0,
     pullDistance: 0,
     refreshStatus: '下拉刷新'
    };
    },
    methods: {
    handleTouchStart(e) {
     this.startY = e.touches[0].clientY;
    },
    handleTouchMove(e) {
     const currentY = e.touches[0].clientY;
     if (currentY - this.startY > 0 && window.scrollY <= 0) {
       this.pullDistance = currentY - this.startY;
       this.refreshStatus = this.pullDistance > 50 ? '释放刷新' : '下拉刷新';
     }
    }
    }
  3. 触发刷新逻辑
    释放时判断是否达到触发阈值:

    handleTouchEnd() {
    if (this.pullDistance > 50) {
     this.refreshStatus = '加载中...';
     this.$emit('refresh'); // 触发父组件刷新
    }
    this.pullDistance = 0;
    }

结合CSS动画优化体验

通过CSS过渡效果使下拉动作更流畅:

.refresh-indicator {
  height: 50px;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform 0.3s ease;
}

注意事项

  • 移动端需确保touchmove事件不会触发浏览器默认行为(如页面滚动),可通过e.preventDefault()控制。
  • 列表数据更新后,需重置下拉状态和动画。
  • 在SSR(服务端渲染)场景下,需动态导入第三方库以避免客户端报错。

标签: vue
分享给朋友:

相关文章

vue实现循环

vue实现循环

Vue 实现循环的方法 在 Vue 中,可以通过 v-for 指令实现循环渲染列表或对象。以下是几种常见的用法: 遍历数组 使用 v-for 遍历数组时,可以同时获取当前项和索引: <ul&…

vue 实现循环

vue 实现循环

Vue 实现循环的方法 在 Vue 中,可以使用 v-for 指令来实现循环渲染列表数据。以下是几种常见的循环实现方式: 基本数组循环 <template> <ul>…

vue实现vmodel

vue实现vmodel

Vue 实现 v-model Vue 的 v-model 是一个语法糖,用于在表单元素或组件上实现双向数据绑定。以下是其实现方式和原理的详细说明。 在表单元素上使用 v-model v-model…

vue实现settimeout

vue实现settimeout

在 Vue 中实现 setTimeout Vue 中可以通过 JavaScript 原生的 setTimeout 方法实现延时操作,但需要注意结合 Vue 的响应式特性和生命周期管理。以下是几种常见实…

vue实现指引

vue实现指引

Vue 实现指引功能 Vue 中实现指引功能可以通过多种方式完成,常见的有使用第三方库或自定义实现。以下是几种常见方法: 使用第三方库(如 driver.js) 安装 driver.js: np…

vue实现popover

vue实现popover

Vue 实现 Popover 的方法 使用第三方库(如 Element UI、Ant Design Vue) 许多成熟的 UI 库已经内置了 Popover 组件,可以直接调用。 Element U…