2018-07-24 17:41:01 +08:00
---
2019-11-15 14:35:25 +08:00
order: 27
2018-07-24 17:41:01 +08:00
title:
en-US: Resizable column
zh-CN: 可伸缩列
2020-12-29 14:54:27 +08:00
debug: true
2018-07-24 17:41:01 +08:00
---
## zh-CN
2020-07-10 22:55:50 +08:00
集成 [react-resizable ](https://github.com/STRML/react-resizable ) 来实现可伸缩列。如果有排序需要,可以通过[额外标记](https://codesandbox.io/s/zrj8xvyzxx)阻止触发排序。
2018-07-24 17:41:01 +08:00
## en-US
2020-07-10 22:55:50 +08:00
Implement resizable column by integrate with [react-resizable ](https://github.com/STRML/react-resizable ). When sort needed, you can use [additional mark ](https://codesandbox.io/s/zrj8xvyzxx ) to prevent resize trigger sort.
2018-07-24 17:41:01 +08:00
2019-05-07 14:57:32 +08:00
```jsx
2018-07-24 17:41:01 +08:00
import { Table } from 'antd';
import { Resizable } from 'react-resizable';
2020-06-29 15:37:36 +08:00
const ResizableTitle = props => {
2018-07-24 17:41:01 +08:00
const { onResize, width, ...restProps } = props;
if (!width) {
return < th { . . . restProps } / > ;
}
return (
2019-07-22 18:52:46 +08:00
< Resizable
width={width}
height={0}
2020-04-24 17:16:44 +08:00
handle={
2020-03-12 21:30:08 +08:00
< span
2020-04-24 17:16:44 +08:00
className="react-resizable-handle"
2020-03-12 21:30:08 +08:00
onClick={e => {
e.stopPropagation();
}}
/>
2020-04-24 17:16:44 +08:00
}
2019-07-22 18:52:46 +08:00
onResize={onResize}
draggableOpts={{ enableUserSelectHack: false }}
>
2018-07-24 17:41:01 +08:00
< th { . . . restProps } / >
< / Resizable >
);
};
class Demo extends React.Component {
state = {
2019-05-07 14:57:32 +08:00
columns: [
{
title: 'Date',
dataIndex: 'date',
width: 200,
},
{
title: 'Amount',
dataIndex: 'amount',
width: 100,
2020-03-12 21:30:08 +08:00
sorter: (a, b) => a.amount - b.amount,
2019-05-07 14:57:32 +08:00
},
{
title: 'Type',
dataIndex: 'type',
width: 100,
},
{
title: 'Note',
dataIndex: 'note',
width: 100,
},
{
title: 'Action',
key: 'action',
2019-08-14 19:36:59 +08:00
render: () => < a > Delete< / a > ,
2019-05-07 14:57:32 +08:00
},
],
2018-07-24 17:41:01 +08:00
};
components = {
header: {
2020-06-29 15:37:36 +08:00
cell: ResizableTitle,
2018-07-24 17:41:01 +08:00
},
};
2019-05-07 14:57:32 +08:00
data = [
{
key: 0,
date: '2018-02-11',
amount: 120,
type: 'income',
note: 'transfer',
},
{
key: 1,
date: '2018-03-11',
amount: 243,
type: 'income',
note: 'transfer',
},
{
key: 2,
date: '2018-04-11',
amount: 98,
type: 'income',
note: 'transfer',
},
];
2018-07-24 17:41:01 +08:00
handleResize = index => (e, { size }) => {
this.setState(({ columns }) => {
const nextColumns = [...columns];
nextColumns[index] = {
...nextColumns[index],
width: size.width,
};
return { columns: nextColumns };
});
};
render() {
const columns = this.state.columns.map((col, index) => ({
...col,
onHeaderCell: column => ({
width: column.width,
onResize: this.handleResize(index),
}),
}));
2019-05-07 14:57:32 +08:00
return < Table bordered components = {this.components} columns = {columns} dataSource = {this.data} / > ;
2018-07-24 17:41:01 +08:00
}
}
ReactDOM.render(< Demo / > , mountNode);
2019-05-07 14:57:32 +08:00
```
2018-07-24 17:41:01 +08:00
2019-05-07 14:57:32 +08:00
```css
2018-07-24 17:41:01 +08:00
#components-table-demo-resizable-column .react-resizable {
position: relative;
2019-06-20 15:32:53 +08:00
background-clip: padding-box;
2018-07-24 17:41:01 +08:00
}
#components-table-demo-resizable-column .react-resizable-handle {
position: absolute;
2020-09-02 10:51:04 +08:00
right: -5px;
bottom: 0;
z-index: 1;
2018-07-24 17:41:01 +08:00
width: 10px;
height: 100%;
cursor: col-resize;
}
2019-05-07 14:57:32 +08:00
```