1
0
mirror of https://github.com/ialley-workshop-open/uni-halo.git synced 2026-07-27 04:20:43 +08:00
Files
uni-halo/src/hooks/useListData.ts
T
小莫唐尼 21eeb912fd feat: 完成uni-halo小程序基础功能迭代
本次提交完成多项核心功能升级与优化:
1. 新增页面背景色变量page3并替换部分页面背景样式
2. 新增通用列表分页请求基础接口类型
3. 调整首页默认跳转路径为首页
4. 重构配置结构,新增插件配置模块
5. 新增瞬间、友链、相册相关API接口与类型定义
6. 重构useRequest导出方式,修复hook导出问题
7. 移除部分调试日志代码
8. 新增padStart兼容polyfill工具函数
9. 新增文章卡片多种布局样式支持
10. 优化友链页面UI展示与交互逻辑
11. 新增瞬间页面时间轴展示模式与时间解析工具
12. 新增相册页面多种浏览模式切换功能
2026-06-14 22:00:54 +08:00

99 lines
2.2 KiB
TypeScript

import type { Ref } from 'vue'
export interface IPaginationParams {
page: number
size: number
}
interface IUpdateDataOptions<T> {
/** 错误信息 */
error: boolean | Error
/** 是否还有更多数据 */
hasNext: boolean
/** 列表数据 */
items: T[]
}
interface IUseListDataOptions<T> {
params: IPaginationParams
/** 加载状态 */
loading: Ref<boolean>
onPullDownRefresh?: (params: IPaginationParams, updateData: (data: IUpdateDataOptions<T>) => void) => void
onReachBottom?: (params: IPaginationParams, updateData: (data: IUpdateDataOptions<T>) => void) => void
}
/**
* useListData是一个定制化的列表数据管理钩子,用于处理列表数据的添加和刷新。
* @param T 列表数据类型,默认为any。
* @returns 返回一个对象{list, append},包含列表数据和数据操作方法。
*/
export function useListData<T>(options: IUseListDataOptions<T>) {
const _hasNext = ref(false)
const _error = ref<boolean | Error>()
const _items = shallowRef<T[]>([])
/** 是否追加数据 */
const isAppend = ref(false)
/** 列表数据 */
const list = shallowRef<T[]>([])
/**
* 数据操作方法
* @param data 新数据数组
*/
function append(data: T[]) {
if (isAppend.value) {
list.value.push(...data)
return
}
list.value = data
}
function _updateData(data: IUpdateDataOptions<T>) {
_error.value = data.error
_hasNext.value = data.hasNext
_items.value = data.items
uni.stopPullDownRefresh()
}
function refresh() {
if (options.loading.value) {
return
}
isAppend.value = false
options.params.page = 1
options.onPullDownRefresh?.(options.params, _updateData)
}
/** 下拉刷新 */
onPullDownRefresh(() => {
refresh()
})
/** 上拉加载更多 */
onReachBottom(() => {
if (options.loading.value) {
return
}
if (!_hasNext.value) {
return
}
options.params.page += 1
isAppend.value = true
options.onReachBottom?.(options.params, _updateData)
})
/** 监听items变化 */
watch(() => _items.value, (newVal) => {
if (_error.value) {
return
}
append(newVal)
})
return {
list,
refresh,
}
}