当前位置:首页 > VUE

vue实现下啦刷新

2026-02-21 15:15:45VUE

Vue 实现下拉刷新

使用第三方库(推荐)

安装 vue-pull-refresh 库:

npm install vue-pull-refresh --save

在组件中使用:

<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 = this.getNewData();
          resolve();
        }, 1000);
      });
    },
    getNewData() {
      // 返回新数据
      return [...];
    }
  }
};
</script>

原生实现

监听触摸事件,手动实现下拉逻辑:

vue实现下啦刷新

<template>
  <div 
    class="pull-refresh"
    @touchstart="touchStart"
    @touchmove="touchMove"
    @touchend="touchEnd"
    :style="{ transform: `translateY(${translateY}px)` }"
  >
    <div class="refresh-tip">
      {{ refreshTip }}
    </div>
    <!-- 内容区域 -->
    <div class="content">
      <!-- 你的内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startY: 0,
      translateY: 0,
      isRefreshing: false,
      refreshTip: '下拉刷新'
    };
  },
  methods: {
    touchStart(e) {
      this.startY = e.touches[0].pageY;
    },
    touchMove(e) {
      const moveY = e.touches[0].pageY;
      const distance = moveY - this.startY;

      if (distance > 0 && window.scrollY <= 0) {
        e.preventDefault();
        this.translateY = Math.min(distance, 100);
        this.refreshTip = this.translateY >= 60 ? '释放刷新' : '下拉刷新';
      }
    },
    touchEnd() {
      if (this.translateY >= 60) {
        this.isRefreshing = true;
        this.refreshTip = '刷新中...';
        this.onRefresh();
      } else {
        this.translateY = 0;
      }
    },
    onRefresh() {
      // 你的刷新逻辑
      setTimeout(() => {
        this.isRefreshing = false;
        this.translateY = 0;
        this.refreshTip = '下拉刷新';
      }, 1000);
    }
  }
};
</script>

<style>
.pull-refresh {
  transition: transform 0.3s;
}
.refresh-tip {
  height: 60px;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

注意事项

  • 原生实现需要考虑边界情况,如页面滚动位置
  • 第三方库通常提供更完善的动画和交互效果
  • 移动端需要添加 touch-action CSS 属性防止默认行为冲突
  • 刷新完成后需要重置状态

两种方式各有优劣,根据项目需求选择合适方案。

标签: vue
分享给朋友:

相关文章

实现vue

实现vue

安装Vue.js 通过npm安装Vue.js是最常见的方式。确保已安装Node.js和npm,运行以下命令: npm install vue 或者使用CDN直接引入: <script src…

vue实现弹窗

vue实现弹窗

Vue 实现弹窗的常见方法 使用组件化方式封装弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏: <template> <…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…

vue筛选实现

vue筛选实现

Vue 筛选实现方法 使用计算属性实现筛选 计算属性是 Vue 中实现数据筛选的常用方式。通过定义一个计算属性,可以根据输入的条件动态过滤数据。 <template> <div…

vue实现追加

vue实现追加

追加数据到数组或列表 在Vue中追加数据到数组或列表,可以通过push方法或concat方法实现。以下是几种常见的实现方式: 方法一:使用push方法 this.items.push(newIte…

vue实现gridlayout

vue实现gridlayout

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