import React, { Component } from 'react'; import { Table } from 'antd'; import styles from './index.less'; import PropTypes from 'prop-types'; const giveNewColumns = (columns, tableId) => { let scrollX = 0; for (let item of columns) { if (item != null) { scrollX = typeof item.width !== 'undefined' ? scrollX + item.width : scrollX + 100; } } const width = document.getElementById(tableId).offsetWidth; if (width < scrollX) { if(columns.length){ let lastItem = columns[columns.length -1]; if( (lastItem.title === '操作' || lastItem.title === '详情') && typeof lastItem.fixed === 'undefined' && typeof lastItem.noNeedFixed === 'undefined'){ columns[columns.length -1].fixed = 'right'; // 操作/ 详情列 增加 浮动 } } return { scrollX, columns, } }else{ return null; } }; export default class NormalTable extends Component { constructor(props) { super(props); this.state = { tableId: Math.random().toString(36).substr(2), scrollX: 0, columns: props.columns, }; } static getDerivedStateFromProps(nextProps, prevState) { if(JSON.stringify(nextProps.columns) === JSON.stringify(prevState.columns)){ return null }else{ const columns = nextProps.columns; let newState = giveNewColumns(columns, prevState.tableId); if(newState){ return { scrollX: newState.scrollX, columns: newState.columns, } }else{ return { columns, } } } } /** * <Table> dom 占得的宽度offsetWidth与计算所得的列宽scrollX * 两者进行比较确定Table scroll的值 */ componentDidMount() { const {tableId,columns } = this.state; let state = giveNewColumns(columns, tableId); if(state){ this.setState({ scrollX: state.scrollX, },()=>{ this.setState({ columns: state.columns, }) }) } } render(){ const { dataSource, rowKey, handleSelectRow, pagination, components, loading,onChange, bordered,scroll,showHeader } = this.props; const { columns } = this.state; /** * 没有传rowSelection 传了handleSelectRow 时 使用 handleSelectRow 并封装rowSelection * 传了rowSelection 直接使用 * */ const rowSelection = handleSelectRow === false ? null : { columnWidth: 30, fixed: true, hideDefaultSelections: false, onChange: (selectedRowKeys, selectedRows) => { handleSelectRow(selectedRowKeys, selectedRows); }, }; const { scrollX } = this.state; if(pagination && pagination.total){ pagination.showTotal=(total, range) => `共${total}条 `; } return ( <Table dataSource={dataSource} showHeader={showHeader} columns={columns} components={components} rowKey={rowKey || 'key'} loading={loading} bordered={bordered} id={this.state.tableId} className={styles.NormalTable} pagination={pagination ? pagination : false} onChange={onChange} scroll={ scrollX > 0 ? { x: scrollX } : scroll} rowSelection={ this.props.rowSelection !== 'undefined' ? this.props.rowSelection : rowSelection } /> ); } } NormalTable.propTypes = { dataSource: PropTypes.array.isRequired, // 表格数据源 To Antd Table bordered: PropTypes.bool, // 是否显示border, columns: PropTypes.array.isRequired, // 字段 To Antd Table rowKey: PropTypes.string, // rowKey To Antd Table handleSelectRow: PropTypes.oneOfType([ PropTypes.func, PropTypes.bool, ]), // 行选择的事件,传false 表示不开放行选择 To Antd Table pagination: PropTypes.oneOfType([ // 多种类型的数据 PropTypes.object, PropTypes.bool, ]), components: PropTypes.object, // 默认覆盖的 Table元素 基本没用 loading: PropTypes.bool, onChange: PropTypes.func, // 分页、排序、筛选变化时触发 }; NormalTable.defaultProps = { rowKey: 'id', handleSelectRow: (selectedRowKeys, selectedRows) => { //console.log(selectedRowKeys, selectedRows); }, // false, pagination: { defaultCurrent: 1, total: 20, pageSize: 5, showQuickJumper: true, onChange: (current, size) => { //console.log(current, size); }, }, loading: false, bordered: false, components: undefined, onChange: () => { //console.log('NormalTable.onChange'); }, dataSource: [], columns: [ { dataIndex: 'id', title: 'id', }, { dataIndex: 'name', title: '名称', }, { dataIndex: 'code', title: '编码', width: 200, }, { dataIndex: 'level', title: '优先级', }, { dataIndex: 'desc', title: '描述', }, { dataIndex: 'name1', title: '名称', }, { dataIndex: 'code1', title: '编码', width: 100, }, { dataIndex: 'level1', title: '优先级', }, { dataIndex: 'desc1', title: '描述', }, { dataIndex: 'name2', title: '名称', }, { dataIndex: 'code2', title: '编码', }, { dataIndex: 'level2', title: '优先级', }, { dataIndex: 'desc2', title: '描述', }, { dataIndex: 'name3', title: '名称', }, { dataIndex: 'code3', title: '编码', }, { dataIndex: 'level3', title: '优先级', }, { dataIndex: 'desc3', title: '描述', }, { dataIndex: 'name4', title: '名称', }, { dataIndex: 'code4', title: '编码', }, { dataIndex: 'level4', title: '优先级', }, { dataIndex: 'desc4', title: '描述', }, { dataIndex: 'operation', title: '操作', fixed: 'right', width: 120, render: (text, record) => { return <span><a>编辑 </a>|<a> 删除</a></span>; }, }, ], };