当前位置:首页 > VUE

vue下拉刷新实现方案

2026-02-22 09:47:52VUE

Vue 下拉刷新实现方案

使用第三方库(如 vantmescroll.js

安装 vant 库:

npm install vant

引入 van-pull-refresh 组件:

<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 事件实现:

<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

封装下拉刷新组件:

vue下拉刷新实现方案

<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实现图片搜索

vue实现图片搜索

Vue实现图片搜索功能 使用HTML5的File API获取图片 通过<input type="file">元素让用户选择图片文件,使用FileReader对象读取图片数据。 <t…

vue系统实现

vue系统实现

Vue 系统实现的关键步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目,安装核心依赖(如 Vue 3、Vue Router、Pinia)。配置开发环境(如 ESLint、Prett…

vue怎样实现mvvm

vue怎样实现mvvm

Vue 实现 MVVM 的原理 Vue 的 MVVM(Model-View-ViewModel)模式通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 MVVM 的核心机制: 数…

vue实现数据联动

vue实现数据联动

Vue 数据联动实现方法 数据联动在 Vue 中通常指多个组件或数据项之间的动态关联更新。以下是几种常见实现方式: 使用 v-model 和计算属性 <template> <…

vue实现图片循环

vue实现图片循环

实现图片循环的基本方法 在Vue中实现图片循环通常使用v-for指令结合数组数据。以下是基础实现方式: <template> <div> <img v-fo…

vue实现效果展示

vue实现效果展示

Vue 实现效果展示的方法 动态数据绑定展示 通过 Vue 的响应式特性,实时展示数据变化。例如,表单输入与预览同步: <template> <div> <…