@schema-render/search-table-react
Version:
Conditional search table component.
150 lines (149 loc) • 5.83 kB
JavaScript
import { useMemoizedFn, utils } from "@schema-render/core-react";
import { useRef, useState } from "react";
import { EClassNames } from "../constants";
const { logger, pick, classNames, templateCompiled } = utils;
/**
* 数据请求模块
*/ export default function useRequest({ request, updateScrollY, table, searchValueRef, locale }) {
var _table_pagination;
// 分页参数
const paginationRef = useRef({
current: 1,
pageSize: (table.pagination !== false ? (_table_pagination = table.pagination) === null || _table_pagination === void 0 ? void 0 : _table_pagination.defaultPageSize : 10) || 10,
total: 0
});
// 请求参数
const requestParamsRef = useRef({});
// 请求额外的参数,如 Antd 排序、过滤数据
const requestExtraParamsRef = useRef({});
// 表格数据源
const dataSourceRef = useRef([]);
// 合计栏数据
const summaryDataRef = useRef({});
// 是否加载表格数据中
const [loading, setLoading] = useState(false);
// 不需要分页时,置空数据
if (table.pagination === false) {
paginationRef.current = {};
}
// 拉取表格数据
const runRequest = useMemoizedFn(async (params, options)=>{
// 结果数据
let result = {
data: [],
total: 0
};
// 防止重复请求
if (loading) {
return result;
}
setLoading(true);
try {
if (request) {
let requestParams = {};
if (options === null || options === void 0 ? void 0 : options.overwrite) {
// 覆盖型
requestParams = params || {};
} else {
// 合并型
requestParams = {
...searchValueRef.current,
...pick(paginationRef.current, 'current', 'pageSize'),
...params
};
}
// 发送请求
const res = await request(requestParams, requestExtraParamsRef.current);
// 储存请求参数,可用于“导出”功能获取同样的参数
requestParamsRef.current = requestParams;
// 存储分页信息
if (requestParams.current) {
paginationRef.current.current = requestParams.current;
}
if (requestParams.pageSize) {
paginationRef.current.pageSize = requestParams.pageSize;
}
paginationRef.current.total = res.total || 0;
// 存储数据源
dataSourceRef.current = res.data || [];
// 存储合计栏数据
summaryDataRef.current = res.summaryData || {};
// 成功返回数据
result = {
...res,
data: dataSourceRef.current,
total: paginationRef.current.total
};
}
} catch (err) {
logger.warn(err);
}
setLoading(false);
// 请求完毕后,更新表格高度,即 scrollY 值
if (table.autoScrollY) {
updateScrollY();
}
// 返回数据
return result;
});
let finalPagination = false;
if (table.pagination !== false) {
var _table_pagination1;
finalPagination = {
style: {
marginBottom: 0
},
showQuickJumper: true,
showSizeChanger: true,
showTotal: (total)=>{
const { current, pageSize } = paginationRef.current;
const start = (current - 1) * pageSize;
const end = start + dataSourceRef.current.length;
return templateCompiled(locale.SearchTable.paginationTotal, {
// 当分页是第一页时,start 为 0,此时取值到 1
start: start || 1,
end,
total
});
},
...table.pagination,
...paginationRef.current,
onChange: (current, pageSize)=>{
var _table_pagination_onChange, _table_pagination;
// 触发外部事件
;
(_table_pagination = table.pagination) === null || _table_pagination === void 0 ? void 0 : (_table_pagination_onChange = _table_pagination.onChange) === null || _table_pagination_onChange === void 0 ? void 0 : _table_pagination_onChange.call(_table_pagination, current, pageSize);
// 设置分页数据
Object.assign(paginationRef.current, {
current,
pageSize
});
// 重新拉取数据
runRequest();
},
// 添加特有类名,用于 scrollY 计算
className: classNames((_table_pagination1 = table.pagination) === null || _table_pagination1 === void 0 ? void 0 : _table_pagination1.className, EClassNames.pagination)
};
}
const updateDataSource = useMemoizedFn((data)=>{
dataSourceRef.current = data;
});
const updateSummaryData = useMemoizedFn((data)=>{
summaryDataRef.current = data;
});
const updateRequestExtraParams = useMemoizedFn((data)=>{
requestExtraParamsRef.current = data;
});
return {
loading,
dataSource: dataSourceRef.current,
updateDataSource,
summaryData: summaryDataRef.current,
updateSummaryData,
requestParamsRef,
requestExtraParamsRef,
updateRequestExtraParams,
finalPagination,
runRequest
};
}