更新记录
1.0.1(2025-08-01)
- 初次上传页面组件
平台兼容性
uni-app(4.75)
Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
快应用-华为 |
快应用-联盟 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(4.75)
Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
- |
- |
- |
- |
- |
- |
📦 PageList 组件文档
基于 uni-app + Vue3 + setup + UTS 封装的下拉刷新 + 上拉加载列表容器组件。
专为微信小程序端优化,内置刷新、加载、空状态和“无更多”提示,可结合分页接口快速构建分页列表。
✅ 功能亮点
- ✨ 支持下拉刷新(onPullDownRefresh)
- ✨ 支持上拉加载更多(onReachBottom)
- ✨ 内置空数据 / 加载中 / 无更多视图
- ✨ 支持自定义插槽替换默认提示
- ✨ 提供状态管理与方法:
isRefreshing
/ isLoadingMore
/ finishRefresh
/ finishLoadMore
/ reset
📦 目录结构
components/PageList.vue # 主组件
composables/usePageList.ts # 列表状态与事件逻辑 Hook
⚙️ 组件 Props
属性 |
类型 |
默认值 |
说明 |
listLength |
number |
- |
当前列表长度,用于判断空状态 |
finished |
boolean |
false |
是否已加载完所有数据,用于显示“没有更多” |
🎉 事件
事件 |
参数 |
说明 |
refresh |
无 |
下拉刷新时触发 |
loadMore |
无 |
上拉加载更多时触发 |
⚠️ 建议在外部页面的 onPullDownRefresh
和 onReachBottom
中调用组件暴露的方法。
🧩 内部方法(通过 ref 调用)
方法 |
返回值 |
说明 |
onPullDownRefreshHandler |
void |
手动触发刷新(内部已处理状态) |
onReachBottomHandler |
void |
手动触发加载更多 |
finishRefresh |
void |
完成刷新后调用(隐藏 loading) |
finishLoadMore |
void |
完成加载更多后调用 |
reset |
void |
重置刷新与加载状态 |
isRefreshing |
Ref |
是否正在刷新 |
isLoadingMore |
Ref |
是否正在加载更多 |
🔧 插槽
插槽名 |
说明 |
(default) |
列表内容区域 |
refresh-indicator |
自定义刷新提示视图 |
load-more |
自定义加载中视图 |
finished |
自定义“没有更多了”提示 |
empty |
自定义空数据提示 |
🛠️ 基本用法
假设外部页面需要监听 onPullDownRefresh
和 onReachBottom
:
<template>
<PageList
ref="pageListRef"
:listLength="items.length"
:finished="finished"
@refresh="loadData(true)"
@loadMore="loadData(false)"
>
<!-- 列表内容 -->
<view v-for="item in items" :key="item.id" class="item">{{ item.name }}</view>
<!-- 自定义无数据 -->
<template #empty>
<view>😅 暂无内容</view>
</template>
</PageList>
</template>
<script setup lang="uts">
import { ref } from 'vue'
const items = ref<any[]>([])
const finished = ref(false)
const pageListRef = ref()
async function loadData(refresh: boolean) {
if (refresh) {
items.value = [] // 重置数据
finished.value = false
}
// 模拟加载数据
const newItems = await fetchItems()
if (refresh) pageListRef.value?.finishRefresh()
else pageListRef.value?.finishLoadMore()
items.value.push(...newItems)
if (newItems.length < 10) finished.value = true
}
// 外部页面生命周期
onPullDownRefresh(() => {
pageListRef.value?.onPullDownRefreshHandler()
})
onReachBottom(() => {
pageListRef.value?.onReachBottomHandler()
})
// 模拟接口
async function fetchItems() {
return new Promise(resolve => {
setTimeout(() => resolve([{ id: Date.now(), name: 'Item ' + Date.now() }]), 500)
})
}
</script>
🎨 默认样式
.page-list
:容器(内边距 & 最小高度)
.refresh-indicator
:刷新中视图
.load-more
:加载中视图
.load-finished
:无更多视图
.empty
:空状态视图
- 内置 loading 动画:
.spinner
样式可根据需求覆盖或通过插槽替换内容
🧰 usePageList Hook 功能
返回值 |
类型 |
说明 |
isRefreshing |
Ref |
是否刷新中 |
isLoadingMore |
Ref |
是否加载中 |
onPullDownRefreshHandler |
Function |
包装刷新逻辑 |
onReachBottomHandler |
Function |
包装加载逻辑 |
finishRefresh |
Function |
刷新完成 |
finishLoadMore |
Function |
加载完成 |
reset |
Function |
重置状态 |
🧪 自定义刷新 / 加载视图示例
<template #refresh-indicator>
<view>🌊 正在努力刷新...</view>
</template>
<template #load-more>
<view>🚀 加载中...</view>
</template>
<template #finished>
<view>🎉 没有更多了</view>
</template>
<template #empty>
<view>📭 空空如也</view>
</template>
✅ 总结
PageList 是一个简洁、易用、可扩展的分页列表容器:
- 内置状态管理
- 支持自定义 UI
- 解耦列表渲染与加载逻辑
- 配合 uni-app 微信小程序生命周期更方便
如果想,我还可以帮你写:
要的话请告诉我! 🚀