import { Table } from 'antd' import './ListTable.css' /** * 列表表格组件 * @param {Object} props * @param {Array} props.columns - 表格列配置 * @param {Array} props.dataSource - 数据源 * @param {string} props.rowKey - 行唯一标识字段 * @param {Array} props.selectedRowKeys - 选中的行 * @param {Function} props.onSelectionChange - 选择变化回调 * @param {boolean} props.isAllPagesSelected - 是否跨页全选所有数据 * @param {number} props.totalCount - 总数据量(用于跨页全选) * @param {Function} props.onSelectAllPages - 选择所有页回调 * @param {Function} props.onClearSelection - 清除选择回调 * @param {Object} props.pagination - 分页配置 * @param {Object} props.scroll - 表格滚动配置 * @param {Function} props.onRowClick - 行点击回调 * @param {Object} props.selectedRow - 当前选中的行 * @param {boolean} props.loading - 加载状态 * @param {string} props.className - 自定义类名 */ function ListTable({ columns, dataSource, rowKey = 'id', selectedRowKeys = [], onSelectionChange, isAllPagesSelected = false, totalCount, onSelectAllPages, onClearSelection, pagination = { pageSize: 10, showSizeChanger: true, showQuickJumper: true, }, scroll = { x: 1200}, onRowClick, selectedRow, loading = false, className = '', }) { // 行选择配置 const rowSelection = { selectedRowKeys, onChange: (newSelectedRowKeys) => { onSelectionChange?.(newSelectedRowKeys) }, // 当跨页全选时,禁用单个复选框 getCheckboxProps: () => ({ disabled: isAllPagesSelected, }), } // 合并分页配置,添加选择信息显示 const mergedPagination = pagination === false ? false : { ...pagination, showTotal: (total) => (
{isAllPagesSelected ? ( <> 已选择 {totalCount || total} {onClearSelection && ( 清除选择 )} ) : selectedRowKeys.length > 0 ? ( <> 已选择 {selectedRowKeys.length} {onSelectAllPages && selectedRowKeys.length < (totalCount || total) && ( 选择全部 {totalCount || total} 项 )} {onClearSelection && ( 清除 )} ) : ( 已选择 0 项 )}
), } return (
({ onClick: () => onRowClick?.(record), className: selectedRow?.[rowKey] === record[rowKey] ? 'row-selected' : '', })} /> ) } export default ListTable