更新记录

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. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。