|
@@ -2,12 +2,13 @@ import {createPageContext, createSearchContext, usePage, useTableSearchState} fr
|
|
|
import {BaseListResult, GetBaseListType, ListParams, OriginalListParams} from '@models';
|
|
|
import {useQuery} from '@tanstack/react-query';
|
|
|
import {shallowEqual} from '@utils';
|
|
|
+import {useLatest} from 'ahooks';
|
|
|
import {useEffect, useRef, useState} from 'react';
|
|
|
|
|
|
-type UseQueryListResult<D extends BaseListResult> = [
|
|
|
+type UseQueryListResult<D extends BaseListResult, T extends unknown[] = GetBaseListType<D>[]> = [
|
|
|
{
|
|
|
count: number,
|
|
|
- data: GetBaseListType<D>[],
|
|
|
+ data: T,
|
|
|
isFetching: boolean,
|
|
|
},
|
|
|
{refetch: () => void},
|
|
@@ -16,26 +17,30 @@ type UseQueryListResult<D extends BaseListResult> = [
|
|
|
type UseQueryListOptions<
|
|
|
P extends ListParams,
|
|
|
R extends BaseListResult,
|
|
|
+ T extends Array<unknown> = GetBaseListType<R>[],
|
|
|
> = {
|
|
|
queryFn: (params: P) => R,
|
|
|
params: OriginalListParams<P>,
|
|
|
pageContext: ReturnType<typeof createPageContext>,
|
|
|
searchContext: ReturnType<typeof createSearchContext>,
|
|
|
+ formatResult?: (data: Awaited<R>) => T,
|
|
|
};
|
|
|
|
|
|
export function useQueryTableList<
|
|
|
P extends ListParams,
|
|
|
R extends BaseListResult,
|
|
|
+ T extends Array<unknown> = GetBaseListType<R>[],
|
|
|
>(
|
|
|
- {queryFn, params, pageContext, searchContext}: UseQueryListOptions<P, R>,
|
|
|
-): UseQueryListResult<R> {
|
|
|
+ {queryFn, params, pageContext, searchContext, formatResult}: UseQueryListOptions<P, R, T>,
|
|
|
+): UseQueryListResult<R, T> {
|
|
|
const [count, setCount] = useState(0);
|
|
|
const [{page, pageSize}, {onCurrentPageChange}] = usePage(pageContext);
|
|
|
- const prevData = useRef<R[]>([]);
|
|
|
+ const prevData = useRef<T>([] as unknown as T);
|
|
|
const prevParams = useRef(params);
|
|
|
+ const formatResultFn = useLatest(formatResult);
|
|
|
|
|
|
- const {data = [], isFetching, refetch} = useQuery<GetBaseListType<R>[]>(
|
|
|
- [queryFn.name, page, pageSize, ...Object.values(params)],
|
|
|
+ const {data = [] as unknown as T, isFetching, refetch} = useQuery<T>(
|
|
|
+ [queryFn.name, page, pageSize, formatResultFn, ...Object.values(params)],
|
|
|
async function() {
|
|
|
/**
|
|
|
* 当参数发生改变说明请求内容发生变化
|
|
@@ -44,6 +49,8 @@ export function useQueryTableList<
|
|
|
if (page !== 1 && !shallowEqual(prevParams.current, params)) {
|
|
|
prevParams.current = params;
|
|
|
onCurrentPageChange(1);
|
|
|
+ // 这里可以返回一个空数组
|
|
|
+ // 记录上一次数据是为了展示 防止闪烁
|
|
|
return prevData.current;
|
|
|
}
|
|
|
|
|
@@ -63,20 +70,24 @@ export function useQueryTableList<
|
|
|
const {total, list} = data.data;
|
|
|
|
|
|
/**
|
|
|
- * 当页面只有一个数据的时候 删除了页码改为前一个 但是数据请求还是当前页码
|
|
|
+ * 场景:当页面只有一个数据的时候 删除了页码改为前一个 但是数据请求还是当前页码
|
|
|
* 需要判断当前是否无数据并且页码大于1 满足时跳转到前一个页面
|
|
|
*/
|
|
|
page > 1 && list.length === 0 && onCurrentPageChange(page - 1);
|
|
|
|
|
|
setCount(total);
|
|
|
-
|
|
|
- return (prevData.current = list);
|
|
|
}
|
|
|
|
|
|
- return [];
|
|
|
+ let res: T;
|
|
|
+
|
|
|
+ formatResultFn.current
|
|
|
+ ? res = formatResultFn.current(data)
|
|
|
+ : res = data.msg === '200' ? data.data.list as unknown as T : [] as unknown as T;
|
|
|
+
|
|
|
+ return (prevData.current = res);
|
|
|
},
|
|
|
{
|
|
|
- placeholderData: [],
|
|
|
+ placeholderData: [] as unknown as T,
|
|
|
keepPreviousData: true,
|
|
|
},
|
|
|
);
|