当前位置:首页 > VUE

vue下拉刷新实现方案

2026-02-22 09:47:52VUE

Vue 下拉刷新实现方案

使用第三方库(如 vantmescroll.js

安装 vant 库:

npm install vant

引入 van-pull-refresh 组件:

vue下拉刷新实现方案

<template>
  <van-pull-refresh v-model="isLoading" @refresh="onRefresh">
    <div>下拉刷新内容</div>
  </van-pull-refresh>
</template>

<script>
import { PullRefresh } from 'vant';
export default {
  data() {
    return {
      isLoading: false
    };
  },
  methods: {
    onRefresh() {
      setTimeout(() => {
        this.isLoading = false;
      }, 1000);
    }
  }
};
</script>

自定义实现方案

监听触摸事件实现下拉刷新:

<template>
  <div 
    class="pull-refresh" 
    @touchstart="handleTouchStart" 
    @touchmove="handleTouchMove" 
    @touchend="handleTouchEnd"
  >
    <div class="refresh-indicator" :style="{ transform: `translateY(${pullDistance}px)` }">
      {{ refreshText }}
    </div>
    <div class="content">
      <!-- 页面内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startY: 0,
      pullDistance: 0,
      isRefreshing: false,
      threshold: 50 // 触发刷新的阈值
    };
  },
  computed: {
    refreshText() {
      if (this.isRefreshing) return '刷新中...';
      return this.pullDistance > this.threshold ? '释放刷新' : '下拉刷新';
    }
  },
  methods: {
    handleTouchStart(e) {
      this.startY = e.touches[0].clientY;
    },
    handleTouchMove(e) {
      if (this.isRefreshing) return;
      const currentY = e.touches[0].clientY;
      this.pullDistance = Math.max(0, currentY - this.startY);
    },
    handleTouchEnd() {
      if (this.pullDistance > this.threshold) {
        this.isRefreshing = true;
        this.onRefresh();
      }
      this.pullDistance = 0;
    },
    onRefresh() {
      // 模拟异步请求
      setTimeout(() => {
        this.isRefreshing = false;
      }, 1500);
    }
  }
};
</script>

<style>
.pull-refresh {
  position: relative;
  overflow: hidden;
}
.refresh-indicator {
  text-align: center;
  padding: 10px;
  transition: transform 0.3s;
}
</style>

使用原生滚动事件

通过监听 scroll 事件实现:

vue下拉刷新实现方案

<template>
  <div class="scroll-container" ref="scrollContainer" @scroll="handleScroll">
    <div class="scroll-content">
      <div class="refresh-indicator">{{ refreshText }}</div>
      <!-- 页面内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isRefreshing: false,
      scrollTop: 0
    };
  },
  computed: {
    refreshText() {
      return this.isRefreshing ? '刷新中...' : '下拉刷新';
    }
  },
  methods: {
    handleScroll() {
      this.scrollTop = this.$refs.scrollContainer.scrollTop;
      if (this.scrollTop < -50 && !this.isRefreshing) {
        this.isRefreshing = true;
        this.onRefresh();
      }
    },
    onRefresh() {
      setTimeout(() => {
        this.isRefreshing = false;
      }, 1000);
    }
  }
};
</script>

<style>
.scroll-container {
  height: 100vh;
  overflow-y: auto;
}
.refresh-indicator {
  text-align: center;
  padding: 10px;
}
</style>

结合 better-scroll 实现

安装 better-scroll

npm install better-scroll

封装下拉刷新组件:

<template>
  <div class="wrapper" ref="wrapper">
    <div class="content">
      <div class="refresh-indicator">{{ refreshText }}</div>
      <!-- 页面内容 -->
    </div>
  </div>
</template>

<script>
import BScroll from 'better-scroll';
export default {
  data() {
    return {
      bs: null,
      isRefreshing: false
    };
  },
  mounted() {
    this.bs = new BScroll(this.$refs.wrapper, {
      pullDownRefresh: {
        threshold: 50,
        stop: 40
      }
    });
    this.bs.on('pullingDown', this.onRefresh);
  },
  methods: {
    onRefresh() {
      this.isRefreshing = true;
      setTimeout(() => {
        this.bs.finishPullDown();
        this.isRefreshing = false;
      }, 1000);
    }
  }
};
</script>

以上方案可根据项目需求选择,第三方库(如 vant)适合快速集成,自定义方案灵活性更高。

标签: 方案vue
分享给朋友:

相关文章

vue实现ajax

vue实现ajax

Vue 中实现 AJAX 的几种方法 在 Vue 中实现 AJAX 请求可以通过原生 JavaScript 的 XMLHttpRequest、第三方库如 axios 或 fetch API 来完成。以…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…

vue底层实现

vue底层实现

Vue.js 的底层实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其关键实现细节: 响应式系统 Vue 2…

vue nexttick实现

vue nexttick实现

Vue 中 nextTick 的实现原理 Vue 的 nextTick 是一个用于在下次 DOM 更新循环结束之后执行延迟回调的方法。它的核心实现依赖于 JavaScript 的事件循环机制。…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <tem…

vue jwt实现

vue jwt实现

Vue JWT 实现方法 安装依赖 确保项目中安装了 jsonwebtoken(后端)和 axios(前端)。若使用 Vue 3,可搭配 vue-router 和 pinia(或 vuex)管理状态。…