antd-table中集成react-dnd

[ant-design官网表格排序例子(https://ant.design/components/table-cn/#components-table-demo-drag-sorting (opens in a new tab))

重写Table组件里的component

代码如下:

class DragSortingTable extends React.Component {
  state = {
    data: [...],
  }
 
  components = {
    body: {
      row: DragableBodyRow,
    },
  }
 
  moveRow = (dragIndex, hoverIndex) => {
    ...
  }
 
  render() {
    return (
      <Table
        columns={columns}
        dataSource={this.state.data}
        components={this.components}
        onRow={(record, index) => ({
          index,
          moveRow: this.moveRow,
        })}
      />
    );
  }
}

其中主要代码是components={this.components}用来覆盖默认的 table 元素,拖动行则需要对row重写:

       body: {
       row: DragableBodyRow,
       },
   }

DragableBodyRow为:

const DragableBodyRow = DropTarget('row', rowTarget, (connect, monitor) => ({
  connectDropTarget: connect.dropTarget(),
}))(
  DragSource('row', rowSource, (connect, monitor) => ({
    connectDragSource: connect.dragSource(),
    dragRow: monitor.getItem(),
  }))(BodyRow)
);

DropTarget和DragSource 是高阶组件.

  class BodyRow extends React.Component {
    render() {
      const {
        connectDragSource,
        connectDropTarget,
        ...restProps
      } = this.props;
 
      ...
 
      return connectDragSource(
        connectDropTarget(
          <tr
            {...restProps}
          />
        )
      );
    }
  }