mirror of
https://github.com/ialley-workshop-open/uni-halo.git
synced 2026-07-27 04:20:43 +08:00
refactor: 项目整体重构与功能完善
1. 配置开发环境接口地址 2. 重构工具函数目录结构,迁移防抖节流等工具到base目录 3. 统一页面布局样式为全屏居中布局 4. 新增大量通用工具函数:深克隆、深合并、uuid、时间格式化、随机数、数组打乱、剪贴板操作等 5. 优化自定义tabbar实现,修复交互逻辑 6. 新增列表数据管理hook和请求loading封装 7. 移除无用测试文件和冗余代码 8. 完善首页内容,增加轮播图、作者卡片、金刚区等模块
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
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(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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user