当前位置:首页 > VUE

vue实现下啦刷新

2026-01-20 23:37:35VUE

Vue 实现下拉刷新

使用第三方库(推荐)

安装 vue-pull-refresh 库:

npm install vue-pull-refresh --save

在组件中引入并使用:

<template>
  <pull-refresh :on-refresh="onRefresh">
    <div class="content">
      <!-- 列表内容 -->
    </div>
  </pull-refresh>
</template>

<script>
import PullRefresh from 'vue-pull-refresh';

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

原生实现

通过监听 touch 事件和滚动事件实现:

<template>
  <div 
    class="pull-refresh"
    @touchstart="touchStart"
    @touchmove="touchMove"
    @touchend="touchEnd"
  >
    <div class="refresh-tip" :style="{ transform: `translateY(${moveY}px)` }">
      {{ refreshText }}
    </div>
    <div class="content">
      <!-- 列表内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startY: 0,
      moveY: 0,
      refreshing: false,
      refreshText: '下拉刷新'
    }
  },
  methods: {
    touchStart(e) {
      this.startY = e.touches[0].pageY;
    },
    touchMove(e) {
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      if (scrollTop > 0) return;

      const moveY = e.touches[0].pageY - this.startY;
      if (moveY > 0) {
        this.moveY = moveY;
        if (moveY > 50) {
          this.refreshText = '释放刷新';
        } else {
          this.refreshText = '下拉刷新';
        }
      }
    },
    touchEnd() {
      if (this.moveY > 50) {
        this.refreshing = true;
        this.refreshText = '刷新中...';
        this.refreshData();
      } else {
        this.moveY = 0;
      }
    },
    refreshData() {
      // 刷新数据逻辑
      setTimeout(() => {
        this.refreshing = false;
        this.moveY = 0;
        this.refreshText = '下拉刷新';
      }, 1000);
    }
  }
}
</script>

<style>
.pull-refresh {
  position: relative;
  overflow: hidden;
}
.refresh-tip {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 50px;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform 0.3s;
}
</style>

结合 Better-Scroll 实现

安装 Better-Scroll:

npm install better-scroll --save

实现代码:

<template>
  <div class="wrapper" ref="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: 20
        },
        click: true
      });

      this.scroll.on('pullingDown', () => {
        this.refreshText = '刷新中...';
        this.refreshData();
      });
    },
    refreshData() {
      setTimeout(() => {
        // 刷新数据逻辑
        this.refreshText = '下拉刷新';
        this.scroll.finishPullDown();
        this.scroll.refresh();
      }, 1000);
    }
  }
}
</script>

<style>
.wrapper {
  height: 100vh;
  overflow: hidden;
}
.refresh-tip {
  height: 50px;
  line-height: 50px;
  text-align: center;
}
</style>

注意事项

  • 移动端实现需考虑 touch 事件
  • 下拉距离阈值通常设为 50px 左右
  • 刷新完成后需要重置状态
  • 列表数据更新后需要重新计算滚动区域高度(Better-Scroll 需调用 refresh())
  • 性能优化:避免频繁触发事件,可使用节流函数

vue实现下啦刷新

标签: vue
分享给朋友:

相关文章

简易实现vue

简易实现vue

简易 Vue 实现思路 核心是数据劫持结合发布-订阅模式,通过 Object.defineProperty 或 Proxy 监听数据变化,触发视图更新。 数据劫持实现 class Observer…

前端多线程实现vue

前端多线程实现vue

前端多线程与Vue的结合 在Vue中实现多线程通常通过Web Worker技术完成。Web Worker允许在后台线程中运行脚本,避免阻塞主线程,适合处理计算密集型任务。 使用Web Worker…

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-for…

vue实现飘窗原理

vue实现飘窗原理

vue实现飘窗原理 飘窗效果通常指在页面上悬浮显示的弹窗或通知,跟随页面滚动或固定在某个位置。Vue实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组件…

vue实现视窗

vue实现视窗

Vue 实现视窗功能 在 Vue 中实现视窗功能通常涉及监听浏览器窗口大小变化、响应式布局或创建自定义弹窗组件。以下是几种常见实现方式: 监听浏览器窗口大小变化 使用 Vue 的 mounted 和…

eventbus vue实现

eventbus vue实现

EventBus 实现原理 EventBus 是一种发布/订阅模式,用于 Vue 组件间的通信。核心是通过一个中央事件总线管理事件监听和触发。 创建 EventBus 在 Vue 项目中创建一个独…