更新记录

1.0.0(2025-10-31)


平台兼容性

uni-app(3.6.12)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- √ √ √ √ × √ √ √
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ √ √ √ √ √ √ √ √ - √ √

其他

多语言 暗黑模式 宽屏模式
× √ √

fgi-refresh 优雅的下拉刷新插件

fgi-refresh logo

uniapp vue3 license

一个优雅的 UniApp 下拉刷新插件,提供流畅的动画效果和简洁的 API
只需一行代码,即可为您的页面添加专业的下拉刷新功能!


✨ 特性

  • 🎨 精美动画 - 流畅的旋转脉冲动画,位于页面中间
  • 🚀 极简使用 - 一行代码启用下拉刷新,告别繁琐配置
  • 🔄 自动管理 - 自动显示/隐藏动画,无需手动控制
  • 💪 统一管理 - 所有页面使用相同逻辑,易于维护
  • 🎯 智能处理 - 自动停止刷新,内置错误处理
  • 🌈 高度可定制 - 支持自定义 Logo、回调等
  • 📱 全平台支持 - App(iOS/Android)、H5、各平台小程序
  • ⚡️ Vue3 组合式API - 基于 Composition API,性能优异
  • 🌓 暗黑模式 - 自动适配系统暗黑模式
  • 📦 零依赖 - 不依赖任何第三方库

📦 安装

方式一:通过 DCloud 插件市场(推荐)

  1. 打开 [插件详情页]()
  2. 点击「使用 HBuilderX 导入插件」
  3. 在 HBuilderX 中确认导入

方式二:手动导入

  1. 下载插件包
  2. 解压到项目的 uni_modules 目录
  3. 重启 HBuilderX(如需要)

🚀 快速开始

1. 配置 pages.json

在需要下拉刷新的页面配置中启用:

{
  "path": "pages/home/index",
  "style": {
    "navigationBarTitleText": "首页",
    "enablePullDownRefresh": true
  }
}

2. 在页面中使用

只需 3 行代码!

<template>
  <view class="page">
    <!-- 1. 添加组件 -->
    <fgi-refresh ref="customRefreshRef" :isRefreshing="isRefreshing" />

    <!-- 你的页面内容 -->
  </view>
</template>

<script setup>
import { useRefresh } from '@/uni_modules/fgi-refresh/composables/useRefresh'

// 2. 使用 composable
const { customRefreshRef, isRefreshing } = useRefresh(async () => {
  // 3. 在这里加载数据
  await loadData()
})

const loadData = async () => {
  // 你的数据加载逻辑
  const res = await uni.request({ url: '...' })
  // ...
}
</script>

就这么简单!✅ 下拉刷新已经配置完成。


📖 详细使用

基础示例

<template>
  <view class="page">
    <fgi-refresh ref="customRefreshRef" :isRefreshing="isRefreshing" />

    <view v-for="item in list" :key="item.id">
      {{ item.name }}
    </view>
  </view>
</template>

<script setup>
import { ref } from 'vue'
import { useRefresh } from '@/uni_modules/fgi-refresh/composables/useRefresh'

const list = ref([])

const { customRefreshRef, isRefreshing } = useRefresh(async () => {
  const res = await uni.request({
    url: 'https://api.example.com/data'
  })
  list.value = res.data.list
})
</script>

多个数据源

<script setup>
import { useRefresh } from '@/uni_modules/fgi-refresh/composables/useRefresh'

const { customRefreshRef, isRefreshing } = useRefresh(async () => {
  // 依次加载多个数据源
  await loadBanners()
  await loadProducts()
  await loadRecommends()
})
</script>

重置分页数据

<script setup>
import { ref } from 'vue'
import { useRefresh } from '@/uni_modules/fgi-refresh/composables/useRefresh'

const list = ref([])
const pageNum = ref(1)

const { customRefreshRef, isRefreshing } = useRefresh(async () => {
  // 重置分页
  pageNum.value = 1
  list.value = []

  // 加载第一页数据
  await loadList()
})
</script>

错误处理

<script setup>
import { useRefresh } from '@/uni_modules/fgi-refresh/composables/useRefresh'

const { customRefreshRef, isRefreshing } = useRefresh(
  async () => {
    await loadData()
  },
  {
    // 显示加载失败提示
    showToast: true,

    // 成功回调
    onSuccess: () => {
      console.log('刷新成功')
    },

    // 失败回调
    onError: (error) => {
      console.error('刷新失败', error)
      uni.showToast({
        title: '刷新失败,请重试',
        icon: 'none'
      })
    }
  }
)
</script>

手动触发刷新

<template>
  <view class="page">
    <fgi-refresh ref="customRefreshRef" :isRefreshing="isRefreshing" />

    <button @click="handleRefresh">手动刷新</button>
  </view>
</template>

<script setup>
import { useRefresh } from '@/uni_modules/fgi-refresh/composables/useRefresh'

const { customRefreshRef, isRefreshing, refresh } = useRefresh(async () => {
  await loadData()
})

// 手动触发刷新
const handleRefresh = async () => {
  await refresh()
}
</script>

自定义 Logo

<template>
  <fgi-refresh 
    ref="customRefreshRef" 
    :isRefreshing="isRefreshing"
    logoUrl="https://your-domain.com/custom-logo.png"
  />
</template>

支持:

  • 🌐 网络图片:https://...
  • 📁 本地图片:/static/logo.png
  • 📝 Base64:data:image/png;base64,...

🔧 API 文档

useRefresh(loadDataFn, options)

参数

参数 类型 必填 说明
loadDataFn Function 是 加载数据的异步函数
options Object 否 配置选项

options 配置

属性 类型 默认值 说明
showToast Boolean false 是否显示加载失败提示
onSuccess Function null 加载成功回调
onError Function null 加载失败回调

返回值

属性 类型 说明
customRefreshRef Ref 自定义刷新组件的引用
isRefreshing Ref<Boolean> 是否正在刷新的状态
refresh Function 手动触发刷新的方法

fgi-refresh 组件 Props

属性 类型 默认值 说明
isRefreshing Boolean false 是否正在刷新
logoUrl String 内置Logo 刷新时显示的 Logo 图片地址

💡 最佳实践

1. 数据加载函数要独立

✅ 推荐

const loadData = async () => {
  // 数据加载逻辑
}

const { customRefreshRef, isRefreshing } = useRefresh(loadData)

❌ 不推荐

const { customRefreshRef, isRefreshing } = useRefresh(async () => {
  // 大量内联代码...
})

2. 并行加载独立数据

const { customRefreshRef, isRefreshing } = useRefresh(async () => {
  // 并行加载
  await Promise.all([
    loadBanners(),
    loadProducts(),
    loadRecommends()
  ])
})

3. 避免频繁刷新

插件已内置防重复刷新机制,但仍建议合理设置刷新时机。


⚠️ 注意事项

1. 必须在模板中添加组件

<fgi-refresh ref="customRefreshRef" :isRefreshing="isRefreshing" />

2. 不要再手动写 onPullDownRefresh

❌ 错误

onPullDownRefresh(() => {
  // ...
})

✅ 正确 - useRefresh 已经处理了

const { customRefreshRef, isRefreshing } = useRefresh(async () => {
  await loadData()
})

3. 确保 pages.json 中启用了下拉刷新

{
  "enablePullDownRefresh": true
}

4. 加载函数必须返回 Promise

✅ 正确

useRefresh(async () => {
  await loadData()
})

❌ 错误

useRefresh(() => {
  loadData() // 没有 await
})

🌍 平台兼容性

平台 支持情况 测试状态
App (iOS) ✅ 已测试
App (Android) ✅ 已测试
H5 ✅ 已测试
微信小程序 ✅ 已测试
支付宝小程序 ✅ 已测试
百度小程序 ✅ 已测试
字节跳动小程序 ✅ 已测试
QQ小程序 ✅ 已测试
快手小程序 ✅ 已测试
京东小程序 ✅ 已测试

🐛 常见问题

Q1: 动画不显示? **A:** 检查以下几点: 1. 是否在模板中添加了 `` 组件 2. 是否在 pages.json 中启用了 `enablePullDownRefresh` 3. ref 名称是否匹配:`ref="customRefreshRef"` 4. 是否正确导入了组件
Q2: 刷新后数据没有更新? **A:** 确保加载函数使用了 `async/await`: ```javascript useRefresh(async () => { await loadData() // 必须有 await }) ```
Q3: 如何在刷新时重置列表? **A:** 在加载函数中清空数组: ```javascript useRefresh(async () => { list.value = [] // 清空列表 pageNum.value = 1 // 重置页码 await loadData() }) ```
Q4: scroll-view 页面如何使用? **A:** 使用手动刷新方法: ```javascript const { customRefreshRef, isRefreshing, refresh } = useRefresh(async () => { await loadData() }) const handlePulldown = async () => { await refresh() // 手动调用 } ```
Q5: 如何自定义动画样式? **A:** 可以通过覆盖样式: ```vue <style> .fgi-refresh { background: rgba(0, 0, 0, 0.5) !important; } </style> ```

📊 性能优化

  • ✅ 动画使用 CSS3 transform,性能优异
  • ✅ 防抖机制,避免重复刷新
  • ✅ 自动资源清理,无内存泄漏
  • ✅ 支持暗黑模式,自动适配
  • ✅ 零依赖,包体积小

📝 更新日志

1.0.0 (2024-01-01)

  • 🎉 首次发布
  • ✨ 支持自定义动画
  • ✨ 统一管理下拉刷新
  • ✨ 自动化处理
  • ✨ 全平台支持

查看完整更新日志


💖 支持

如果这个插件对您有帮助,欢迎:

  • ⭐ Star 收藏
  • 🐛 提交 Issue
  • 💡 提交 PR
  • 📢 分享给朋友
  • ☕ 请作者喝咖啡

📄 License

MIT License

Copyright (c) 2024 MichaelNengQiang


👨💻 作者

MichaelNengQiang


🙏 鸣谢

感谢所有使用和支持这个插件的开发者!


Made with ❤️ by MichaelNengQiang

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。