zy-react-library/hooks/useTable/index.js

106 lines
3.5 KiB
JavaScript
Raw Normal View History

2025-10-22 14:43:42 +08:00
import { useAntdTable } from "ahooks";
import useUrlQueryCriteria from "../useUrlQueryCriteria";
2025-10-22 14:43:42 +08:00
/**
* 获取数据
*/
function getService(service, getExtraParams = {}, transform) {
// 获取额外的参数
const extraParams = (typeof getExtraParams === "function" ? getExtraParams() : getExtraParams) || {};
// 获取数据
return async ({ current, pageSize }, formData = {}) => {
// 如果提供了 transform 函数,则在请求之前调用它
let transformedFormData = formData;
if (typeof transform === "function") {
const transformResult = transform(formData);
// 如果 transform 函数有返回值则将其与原始表单数据合并transform 的优先级更高
if (transformResult && typeof transformResult === "object") {
transformedFormData = { ...formData, ...transformResult };
}
}
// 发起请求
const res = await service({
pageIndex: current,
pageSize,
...transformedFormData,
...extraParams,
});
// 返回数据
return {
list: res.data || [],
total: res.totalCount || 0,
...res,
};
};
}
/**
* 自定义 useTable继承 ahooks useAntdTable根据需求进行扩展
*/
function useTable(service, options) {
2025-10-31 14:26:46 +08:00
if (!service)
throw new Error("请传入 service");
2025-10-22 14:43:42 +08:00
// 获取额外参数和转换函数
const { params: extraParams, transform, ...restOptions } = options || {};
// 获取配置项
const {
useStorageQueryCriteria = true,
usePagination = true,
defaultType = "advance",
defaultCurrent = 1,
2025-11-11 14:40:56 +08:00
defaultPageSize = 20,
2025-10-22 14:43:42 +08:00
defaultPagination = { current: defaultCurrent, pageSize: defaultPageSize },
...restRestOptions
} = restOptions;
const { setUrlCriteriaQuery, getUrlCriteriaQuery } = useUrlQueryCriteria();
2025-10-22 14:43:42 +08:00
// 获取存储的查询条件
const storageQueryCriteriaSearchForm = useStorageQueryCriteria ? getUrlCriteriaQuery("searchFormKeys", "searchFormValues") : {};
const storageQueryCriteriaPagination = useStorageQueryCriteria && usePagination ? getUrlCriteriaQuery("paginationKeys", "paginationValues") : {};
2025-10-22 14:43:42 +08:00
// 确定实际使用的搜索表单和分页参数
const actualSearchForm = Object.keys(storageQueryCriteriaSearchForm).length > 0 ? storageQueryCriteriaSearchForm : {};
/** @type {{current: number, pageSize: number}} */
const actualPagination = usePagination ? Object.keys(storageQueryCriteriaPagination).length > 0 ? storageQueryCriteriaPagination : defaultPagination : {};
// 调用 ahooks 的 useAntdTable
const res = useAntdTable(
getService(service, extraParams, transform),
{
...restRestOptions,
defaultParams: [actualPagination, actualSearchForm],
defaultType,
onSuccess: (data, params) => {
// 执行成功回调,为了保留 ahooks 的 onSuccess 回调
restOptions.onSuccess && restOptions.onSuccess(data, params);
// 存储查询条件和分页到 URL
useStorageQueryCriteria && setUrlCriteriaQuery(
2025-10-22 14:43:42 +08:00
params[1] ?? {},
usePagination
? { current: res.tableProps.pagination.current, pageSize: res.tableProps.pagination.pageSize }
: {},
);
},
},
);
// 执行回调函数
restOptions.callback && restOptions.callback(res?.data?.list || [], res?.data || {});
// 返回结果
return {
...res,
tableProps: {
...res.tableProps,
pagination: usePagination ? { ...res.tableProps.pagination, showQuickJumper: true, showSizeChanger: true } : false,
},
getData: res.search.submit,
};
}
export default useTable;