You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.8 KiB
145 lines
3.8 KiB
/*
|
|
* @description: 分页请求
|
|
* @fileName: useListLoadClass.ts
|
|
* @author: lxx
|
|
* @date: 2023-07-08 08:55:52
|
|
* @version: V1.0.0
|
|
*/
|
|
import { reactive, ref, computed } from "vue"
|
|
import { onReachBottom } from "@dcloudio/uni-app"
|
|
|
|
class LoadDataClass {
|
|
// 请求参数
|
|
static queryParams = reactive({
|
|
page: 1,
|
|
limit: 10
|
|
})
|
|
// 列表数据
|
|
list = ref<any[]>([])
|
|
total = ref(0)
|
|
// 前置处理方法
|
|
afterLoadData: Function | undefined
|
|
// 请求方法
|
|
Query: Function
|
|
// 加载状态参数
|
|
isLoading = ref(false)
|
|
// 无更多数据了
|
|
isNoData = computed(() => {
|
|
if (LoadDataClass.queryParams.page * LoadDataClass.queryParams.limit >= this.total.value) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
})
|
|
// 显示暂无数据
|
|
isEmpty = computed(() => {
|
|
if (this.total.value === 0) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
})
|
|
|
|
constructor(apiFunctions: Function, afterLoadData?: Function, options: any = {}) {
|
|
this.queryParamsReset()
|
|
this.Query = apiFunctions
|
|
this.afterLoadData = afterLoadData
|
|
// console.log('options', options)
|
|
// 存在额外参数拼接
|
|
this.setParams(options)
|
|
}
|
|
// 加载数据
|
|
LoadData = async () => {
|
|
uni.showLoading({
|
|
title: '加载中...'
|
|
})
|
|
this.isLoading.value = true
|
|
const res = await this.Query(LoadDataClass.queryParams)
|
|
this.afterLoadData && this.afterLoadData(res)
|
|
this.total.value = res.data.total
|
|
this.list.value = this.list.value.concat(res.data.data)
|
|
|
|
uni.hideLoading()
|
|
uni.stopPullDownRefresh()
|
|
this.isLoading.value = false
|
|
}
|
|
/**
|
|
* 添加额外参数刷新
|
|
* @param options: 参数
|
|
* @param isClear: 是否清空数据 false
|
|
*/
|
|
setParams = (options: any, isClear: boolean = false) => {
|
|
if (isClear) {
|
|
this.queryParamsReset()
|
|
} else {
|
|
LoadDataClass.queryParams.page = 1
|
|
}
|
|
this.list.value = []
|
|
LoadDataClass.queryParams = Object.assign(LoadDataClass.queryParams, options)
|
|
// 加载数据
|
|
this.LoadData()
|
|
}
|
|
// 加载更多
|
|
LoadMore = () => {
|
|
if (this.isNoData.value || this.isLoading.value) return // 无数据或者加载中不进行加载
|
|
LoadDataClass.queryParams.page += 1
|
|
this.LoadData()
|
|
}
|
|
// 重置参数
|
|
queryParamsReset = () => {
|
|
LoadDataClass.queryParams = reactive({
|
|
page: 1,
|
|
limit: 10
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 刷新
|
|
* @param isClear: 是否清空数据
|
|
*/
|
|
ReLoad = (isClear: boolean = false) => {
|
|
this.isLoading.value = false
|
|
this.list.value = []
|
|
if (isClear) {
|
|
this.queryParamsReset()
|
|
} else {
|
|
LoadDataClass.queryParams.page = 1
|
|
}
|
|
this.LoadData()
|
|
}
|
|
}
|
|
/**
|
|
* 分页加载数据方法
|
|
* @param api: ListAPI 方法
|
|
* @param afterLoadData: res数据前置处理方法
|
|
* @returns
|
|
*/
|
|
interface LoadDataInt {
|
|
api: Function
|
|
afterLoadData?: Function
|
|
options?: any
|
|
isNeedReachBottom?: boolean
|
|
}
|
|
|
|
export function LoadData({ api, afterLoadData, options, isNeedReachBottom = true }: LoadDataInt) {
|
|
const data = new LoadDataClass(api, afterLoadData, options)
|
|
|
|
// 下拉加载
|
|
if (isNeedReachBottom) {
|
|
onReachBottom(() => {
|
|
console.log('onReachBottom')
|
|
data.LoadMore()
|
|
})
|
|
}
|
|
|
|
return {
|
|
list: data.list,
|
|
isLoading: data.isLoading,
|
|
isNoData: data.isNoData,
|
|
isEmpty: data.isEmpty,
|
|
ReLoad: data.ReLoad,
|
|
setParams: data.setParams,
|
|
LoadMore: data.LoadMore
|
|
}
|
|
}
|
|
|
|
|