index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import React, { PureComponent, Fragment } from 'react';
  2. import { Table, Alert } from 'antd';
  3. import styles from './index.less';
  4. function initTotalList(columns) {
  5. const totalList = [];
  6. columns.forEach(column => {
  7. if (column.needTotal) {
  8. totalList.push({ ...column, total: 0 });
  9. }
  10. });
  11. return totalList;
  12. }
  13. class StandardTable extends PureComponent {
  14. static getDerivedStateFromProps(nextProps) {
  15. // clean state
  16. if (nextProps.selectedRows.length === 0) {
  17. const needTotalList = initTotalList(nextProps.columns);
  18. return {
  19. selectedRowKeys: [],
  20. needTotalList,
  21. };
  22. }
  23. return null;
  24. }
  25. constructor(props) {
  26. super(props);
  27. const { columns } = props;
  28. const needTotalList = initTotalList(columns);
  29. this.state = {
  30. selectedRowKeys: [],
  31. needTotalList,
  32. };
  33. }
  34. handleRowSelectChange = (selectedRowKeys, selectedRows) => {
  35. let needTotalList = [...this.state.needTotalList];
  36. needTotalList = needTotalList.map(item => {
  37. return {
  38. ...item,
  39. total: selectedRows.reduce((sum, val) => {
  40. return sum + parseFloat(val[item.dataIndex], 10);
  41. }, 0),
  42. };
  43. });
  44. if (this.props.onSelectRow) {
  45. this.props.onSelectRow(selectedRows);
  46. }
  47. this.setState({ selectedRowKeys, needTotalList });
  48. };
  49. handleTableChange = (pagination, filters, sorter) => {
  50. this.props.onChange(pagination, filters, sorter);
  51. };
  52. cleanSelectedKeys = () => {
  53. this.handleRowSelectChange([], []);
  54. };
  55. render() {
  56. const { selectedRowKeys, needTotalList } = this.state;
  57. const { data: { list, pagination }, loading, columns, rowKey } = this.props;
  58. const paginationProps = {
  59. showSizeChanger: true,
  60. showQuickJumper: true,
  61. ...pagination,
  62. };
  63. const rowSelection = {
  64. selectedRowKeys,
  65. onChange: this.handleRowSelectChange,
  66. getCheckboxProps: record => ({
  67. disabled: record.disabled,
  68. }),
  69. };
  70. return (
  71. <div className={styles.standardTable}>
  72. <div className={styles.tableAlert}>
  73. <Alert
  74. message={
  75. <Fragment>
  76. 已选择 <a style={{ fontWeight: 600 }}>{selectedRowKeys.length}</a> 项&nbsp;&nbsp;
  77. {needTotalList.map(item => (
  78. <span style={{ marginLeft: 8 }} key={item.dataIndex}>
  79. {item.title}总计&nbsp;
  80. <span style={{ fontWeight: 600 }}>
  81. {item.render ? item.render(item.total) : item.total}
  82. </span>
  83. </span>
  84. ))}
  85. <a onClick={this.cleanSelectedKeys} style={{ marginLeft: 24 }}>
  86. 清空
  87. </a>
  88. </Fragment>
  89. }
  90. type="info"
  91. showIcon
  92. />
  93. </div>
  94. <Table
  95. loading={loading}
  96. rowKey={rowKey || 'key'}
  97. rowSelection={rowSelection}
  98. dataSource={list}
  99. columns={columns}
  100. pagination={paginationProps}
  101. onChange={this.handleTableChange}
  102. />
  103. </div>
  104. );
  105. }
  106. }
  107. export default StandardTable;