当前位置:首页 > 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>

原生实现

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

<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实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery…

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-for…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…

vue实现tree

vue实现tree

Vue 实现 Tree 组件 使用 Vue 实现 Tree 组件可以通过递归组件的方式来实现层级结构展示。以下是一个完整的实现方法: 基础递归组件实现 创建 Tree 组件文件 Tree.vue,…

vue拖动实现

vue拖动实现

实现 Vue 拖动功能的方法 使用 HTML5 拖放 API 在 Vue 中可以利用 HTML5 的原生拖放 API 实现拖动功能。通过 draggable 属性标记可拖动元素,结合 @dragsta…

vue实现发帖

vue实现发帖

使用 Vue 实现发帖功能 前端实现 创建发帖表单组件,包含标题和内容输入框,以及提交按钮。使用 v-model 绑定表单数据。 <template> <div>…