/* eslint-disable jsx-a11y/anchor-is-valid */ import React, { PureComponent, Fragment } from 'react'; import { Table, Alert } from 'antd'; import { TableProps, ColumnProps, PaginationConfig, } from 'antd/lib/table'; import classNames from 'classnames'; import styles from './index.less'; type OmittedTableProps = Omit, 'dataSource' | 'store' | 'checkboxPropsCache' | 'setCheckboxPropsCache'>; export interface StandardTableColumnProps extends ColumnProps { needTotal?: boolean; } function initTotalList(columns: StandardTableColumnProps[]) { const totalList: any[] = []; columns.forEach(column => { if (column.needTotal) { totalList.push({ ...column, total: 0 }); } }); return totalList; } export interface StandardTableProps extends OmittedTableProps { columns: StandardTableColumnProps[]; onSelectRow: (rows: T[]) => void; data: { list: T[]; pagination?: PaginationConfig; }; checkable?: boolean; selectedRows?: T[]; } interface StandardTableState { selectedRowKeys: string[] | number[]; needTotalList: StandardTableColumnProps & { total: number }[]; } function initialState(props: StandardTableProps) { const { columns } = props; const needTotalList = initTotalList(columns); return { selectedRowKeys: [], needTotalList, }; } class StandardTable extends PureComponent, StandardTableState> { static defaultProps = { rowKey: 'id', checkable: true, data: { list: [], pagination: {} }, onSelectRow: () => { }, } static getDerivedStateFromProps(nextProps: StandardTableProps) { const { checkable } = nextProps; if (checkable && nextProps.selectedRows && nextProps.selectedRows.length === 0) { const needTotalList = initTotalList(nextProps.columns); return { selectedRowKeys: [], needTotalList, }; } return null; } state = initialState(this.props); handleRowSelectChange = (selectedRowKeys: string[] | number[], selectedRows: T[]) => { const { onSelectRow } = this.props; let { needTotalList } = this.state; needTotalList = needTotalList.map(item => ({ ...item, total: selectedRows.reduce((sum, val) => sum + parseFloat(val[item.dataIndex]), 0), })); onSelectRow(selectedRows); this.setState({ selectedRowKeys, needTotalList }); }; cleanSelectedKeys = () => { this.handleRowSelectChange([], []); }; render() { const { selectedRowKeys, needTotalList } = this.state; const { data, checkable, rowClassName, pagination: extraPagination, ...rest } = this.props; const { list = [], pagination } = data; let paginationProps: PaginationConfig | false = { showSizeChanger: true, showQuickJumper: true, hideOnSinglePage: true, showTotal: (total, range) => `${range[0]}-${range[1]},总计 ${total} 条`, ...extraPagination, ...pagination, }; if (extraPagination === false) { paginationProps = false; } let rowSelection: any = { selectedRowKeys, onChange: this.handleRowSelectChange, getCheckboxProps: record => ({ disabled: record.disabled, }), }; if (!checkable) { rowSelection = null; } return (
{checkable ? (
已选择 {selectedRowKeys.length} 项   {needTotalList.map(item => ( {item.title} 总计  {item.render ? item.render(item.total) : item.total} ))} 清空 } type="info" showIcon />
) : null} { let extraRowClassname: string = ''; if (rowClassName) { extraRowClassname = rowClassName(record, index); } return classNames(styles.tableRow, extraRowClassname); }} rowSelection={rowSelection} dataSource={list} pagination={paginationProps} {...rest} /> ); } } export default StandardTable;