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
小莫唐尼 c847dfb1c4 feat: 新增返回顶部功能与优化首页横幅样式
1.  给useListData的下拉刷新添加调试日志
2.  首页横幅替换固定图片为随机资源图,调整渐变背景层级
3.  新增tabbar滚动监听与返回顶部按钮功能
2026-06-12 00:12:43 +08:00

103 lines
2.4 KiB
TypeScript

import type { Ref } from 'vue'
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() {
console.log('刷新数据', options)
if (options.loading.value) {
return
}
isAppend.value = false
options.params.page = 1
options.onPullDownRefresh?.(options.params, _updateData)
}
/** 下拉刷新 */
onPullDownRefresh(() => {
console.log('下拉刷新', options)
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) => {
console.log('监听数据变化', newVal)
console.log('监听数据变化', options)
if (_error.value) {
return
}
append(newVal)
})
return {
list,
refresh,
}
}