mirror of
https://github.com/ialley-workshop-open/uni-halo.git
synced 2026-07-27 04:20:43 +08:00
c847dfb1c4
1. 给useListData的下拉刷新添加调试日志 2. 首页横幅替换固定图片为随机资源图,调整渐变背景层级 3. 新增tabbar滚动监听与返回顶部按钮功能
103 lines
2.4 KiB
TypeScript
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,
|
|
}
|
|
}
|