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