index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. constructor(props) {
  15. super(props);
  16. const { columns } = props;
  17. const needTotalList = initTotalList(columns);
  18. this.state = {
  19. selectedRowKeys: [],
  20. needTotalList,
  21. };
  22. }
  23. static getDerivedStateFromProps(nextProps) {
  24. // clean state
  25. if (nextProps.selectedRows.length === 0) {
  26. const needTotalList = initTotalList(nextProps.columns);
  27. return {
  28. selectedRowKeys: [],
  29. needTotalList,
  30. };
  31. }
  32. return null;
  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 {
  58. data: { list, pagination },
  59. loading,
  60. columns,
  61. rowKey,
  62. } = this.props;
  63. const paginationProps = {
  64. showSizeChanger: true,
  65. showQuickJumper: true,
  66. ...pagination,
  67. };
  68. const rowSelection = {
  69. selectedRowKeys,
  70. onChange: this.handleRowSelectChange,
  71. getCheckboxProps: record => ({
  72. disabled: record.disabled,
  73. }),
  74. };
  75. return (
  76. <div className={styles.standardTable}>
  77. <div className={styles.tableAlert}>
  78. <Alert
  79. message={
  80. <Fragment>
  81. 已选择 <a style={{ fontWeight: 600 }}>{selectedRowKeys.length}</a> 项&nbsp;&nbsp;
  82. {needTotalList.map(item => (
  83. <span style={{ marginLeft: 8 }} key={item.dataIndex}>
  84. {item.title}总计&nbsp;
  85. <span style={{ fontWeight: 600 }}>
  86. {item.render ? item.render(item.total) : item.total}
  87. </span>
  88. </span>
  89. ))}
  90. <a onClick={this.cleanSelectedKeys} style={{ marginLeft: 24 }}>
  91. 清空
  92. </a>
  93. </Fragment>
  94. }
  95. type="info"
  96. showIcon
  97. />
  98. </div>
  99. <Table
  100. loading={loading}
  101. rowKey={rowKey || 'key'}
  102. rowSelection={rowSelection}
  103. dataSource={list}
  104. columns={columns}
  105. pagination={paginationProps}
  106. onChange={this.handleTableChange}
  107. />
  108. </div>
  109. );
  110. }
  111. }
  112. export default StandardTable;