feat: 高级列表
This commit is contained in:
116
src/hooks/antd/useEnhancedTable.ts
Normal file
116
src/hooks/antd/useEnhancedTable.ts
Normal file
@@ -0,0 +1,116 @@
|
||||
// hooks/useEnhancedTable.ts
|
||||
import { useRef, useState, useCallback } from "react";
|
||||
import { ActionType } from "@ant-design/pro-components";
|
||||
import { message } from "antd";
|
||||
import {
|
||||
UseEnhancedTableOptions,
|
||||
UseEnhancedTableReturn,
|
||||
} from "@/components/EnhancedProTable/types";
|
||||
|
||||
export function useEnhancedTable<T>(
|
||||
options: UseEnhancedTableOptions<T> = {}
|
||||
): UseEnhancedTableReturn<T> {
|
||||
const actionRef = useRef<ActionType>(undefined);
|
||||
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
|
||||
const [selectedRows, setSelectedRows] = useState<T[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
const { onAdd, onEdit, onDelete, onView, onExport, onBatchDelete } = options;
|
||||
|
||||
// 刷新表格
|
||||
const reload = useCallback(() => {
|
||||
actionRef.current?.reload();
|
||||
}, []);
|
||||
|
||||
// 重置表格
|
||||
const reset = useCallback(() => {
|
||||
actionRef.current?.reset?.();
|
||||
setSelectedRowKeys([]);
|
||||
setSelectedRows([]);
|
||||
}, []);
|
||||
|
||||
// 清空选择
|
||||
const clearSelection = useCallback(() => {
|
||||
setSelectedRowKeys([]);
|
||||
setSelectedRows([]);
|
||||
}, []);
|
||||
|
||||
// 处理删除
|
||||
const handleDelete = useCallback(
|
||||
async (record: T) => {
|
||||
if (!onDelete) return;
|
||||
|
||||
setLoading(true);
|
||||
try {
|
||||
const success = await onDelete(record);
|
||||
if (success) {
|
||||
message.success("删除成功");
|
||||
reload();
|
||||
}
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
},
|
||||
[onDelete, reload]
|
||||
);
|
||||
|
||||
// 处理批量删除
|
||||
const handleBatchDelete = useCallback(
|
||||
async (keys: React.Key[]) => {
|
||||
if (!onBatchDelete || keys.length === 0) return;
|
||||
|
||||
setLoading(true);
|
||||
try {
|
||||
const success = await onBatchDelete(keys);
|
||||
if (success) {
|
||||
message.success("批量删除成功");
|
||||
clearSelection();
|
||||
reload();
|
||||
}
|
||||
} catch (error) {
|
||||
message.error("批量删除失败");
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
},
|
||||
[onBatchDelete, clearSelection, reload]
|
||||
);
|
||||
|
||||
// 处理导出
|
||||
const handleExport = useCallback(
|
||||
(rows: T[]) => {
|
||||
if (!onExport) return;
|
||||
if (rows.length === 0) {
|
||||
message.warning("请选择要导出的数据");
|
||||
return;
|
||||
}
|
||||
onExport(rows);
|
||||
},
|
||||
[onExport]
|
||||
);
|
||||
|
||||
return {
|
||||
actionRef,
|
||||
selectedRowKeys,
|
||||
selectedRows,
|
||||
loading,
|
||||
setSelectedRowKeys,
|
||||
setSelectedRows,
|
||||
reload,
|
||||
reset,
|
||||
clearSelection,
|
||||
handleDelete,
|
||||
handleBatchDelete,
|
||||
handleExport,
|
||||
actions: {
|
||||
add: onAdd,
|
||||
edit: onEdit,
|
||||
delete: handleDelete,
|
||||
view: onView,
|
||||
export: handleExport,
|
||||
batchDelete: handleBatchDelete,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export type { UseEnhancedTableOptions, UseEnhancedTableReturn };
|
||||
Reference in New Issue
Block a user