antd 表格开发: 列宽拉伸触发排序事件,问题修复

拖动列宽的表格组件,通过resizing字段控制,Resizable的onResizeStart,onResizeStop属性进行判断,实现拖动时防止误触。

import { Table, ConfigProvider, Empty } from 'antd';

import { Resizable } from 'react-resizable';

import PropTypes from 'prop-types';



const ResizeableTitle = props => {

  const { onResize, width, onClick,...restProps } = props;

  let resizing = false;

  

  if (!width) {

    return <th {...restProps} />;

  }



  return (

    <Resizable width={width} height={0} onResize={onResize} 

      onResizeStart={() => {

          resizing = true;

      }}

      onResizeStop={() => {

        resizing = true;

        setTimeout(() => {

          resizing = false;

        },100);

      }}>

      <th {...restProps}

        onClick={(...args) => {

          if (!resizing) {

            onClick(...args);

          }

      }}/>

    </Resizable>

  );

};



class CustomTable extends React.Component {

  state = {

    columns: [],

    expandedRows: [],

  };



  componentDidMount() {

    this.setState({

      columns: this.props.columns,

    });

  }



  componentWillReceiveProps(nextProps) {

    this.setState({

      columns: nextProps.columns,

    });

  }



  components = {

    header: {

      cell: ResizeableTitle,

    },

  };



  handleResize = index => (e, { size }) => {

    this.setState(({ columns }) => {

      const nextColumns = [...columns];

      nextColumns[index] = {

        ...nextColumns[index],

        width: size.width,

      };

      return { columns: nextColumns };

    });

  };

  onExpandedRowsChange = keys => {

    if (this.props.onExpandedRowsChange) {

      this.props.onExpandedRowsChange(keys);

    } else {

      this.setState({ expandedRows: keys });

    }

  };

  render() {

    const columns = this.props.noReSize

      ? this.state.columns

      : this.state.columns &&

        this.state.columns.map((col, index) => ({

          ...col,

          onHeaderCell: column => ({

            width: parseInt(column.width) || 120,

            onResize: this.handleResize(index),

          }),

        }));

    const { expandedRows } = this.state;



    return (

      <ConfigProvider renderEmpty={() => <Empty />}>

        <Table

          {...this.props}

          components={this.components}

          columns={columns}

          expandedRowKeys={

            this.props.onExpandedRowsChange ? this.props.expandedRowKeys : expandedRows

          }

          onExpandedRowsChange={this.onExpandedRowsChange}

        />

      </ConfigProvider>

    );

  }

}



CustomTable.propTypes = {

  dataSource: PropTypes.array,

  columns: PropTypes.array,

  prefixCls: PropTypes.string,

  useFixedHeader: PropTypes.bool,

  rowSelection: PropTypes.object,

  className: PropTypes.string,

  size: PropTypes.string,

  loading: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),

  bordered: PropTypes.bool,

  onChange: PropTypes.func,

  locale: PropTypes.object,

  dropdownPrefixCls: PropTypes.string,

};



CustomTable.defaultProps = {

  dataSource: [],

  prefixCls: 'ant-table',

  useFixedHeader: false,

  className: '',

  size: 'default',

  loading: false,

  bordered: true,

  indentSize: 20,

  locale: {},

  rowKey: 'key',

  showHeader: true,

  defaultExpandAllRows: false,

  defaultExpandedRowKeys: [],

  expandedRowKeys: [],

};



export default CustomTable;

参考

https://codesandbox.io/s/resizeabletable-forked-yxlqr?file=/src/index.js

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值