mirror of
https://github.com/ant-design/ant-design.git
synced 2024-12-21 21:28:09 +08:00
120 lines
3.1 KiB
TypeScript
120 lines
3.1 KiB
TypeScript
import React, { useState } from 'react';
|
|
import type { DragEndEvent } from '@dnd-kit/core';
|
|
import { DndContext, PointerSensor, useSensor, useSensors } from '@dnd-kit/core';
|
|
import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
|
|
import {
|
|
arrayMove,
|
|
SortableContext,
|
|
useSortable,
|
|
verticalListSortingStrategy,
|
|
} from '@dnd-kit/sortable';
|
|
import { CSS } from '@dnd-kit/utilities';
|
|
import { Table } from 'antd';
|
|
import type { TableColumnsType } from 'antd';
|
|
|
|
interface DataType {
|
|
key: string;
|
|
name: string;
|
|
age: number;
|
|
address: string;
|
|
}
|
|
|
|
const columns: TableColumnsType<DataType> = [
|
|
{
|
|
title: 'Name',
|
|
dataIndex: 'name',
|
|
},
|
|
{
|
|
title: 'Age',
|
|
dataIndex: 'age',
|
|
},
|
|
{
|
|
title: 'Address',
|
|
dataIndex: 'address',
|
|
},
|
|
];
|
|
|
|
interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
|
|
'data-row-key': string;
|
|
}
|
|
|
|
const Row: React.FC<Readonly<RowProps>> = (props) => {
|
|
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
id: props['data-row-key'],
|
|
});
|
|
|
|
const style: React.CSSProperties = {
|
|
...props.style,
|
|
transform: CSS.Translate.toString(transform),
|
|
transition,
|
|
cursor: 'move',
|
|
...(isDragging ? { position: 'relative', zIndex: 9999 } : {}),
|
|
};
|
|
|
|
return <tr {...props} ref={setNodeRef} style={style} {...attributes} {...listeners} />;
|
|
};
|
|
|
|
const App: React.FC = () => {
|
|
const [dataSource, setDataSource] = useState([
|
|
{
|
|
key: '1',
|
|
name: 'John Brown',
|
|
age: 32,
|
|
address:
|
|
'Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text',
|
|
},
|
|
{
|
|
key: '2',
|
|
name: 'Jim Green',
|
|
age: 42,
|
|
address: 'London No. 1 Lake Park',
|
|
},
|
|
{
|
|
key: '3',
|
|
name: 'Joe Black',
|
|
age: 32,
|
|
address: 'Sidney No. 1 Lake Park',
|
|
},
|
|
]);
|
|
|
|
const sensors = useSensors(
|
|
useSensor(PointerSensor, {
|
|
activationConstraint: {
|
|
// https://docs.dndkit.com/api-documentation/sensors/pointer#activation-constraints
|
|
distance: 1,
|
|
},
|
|
}),
|
|
);
|
|
|
|
const onDragEnd = ({ active, over }: DragEndEvent) => {
|
|
if (active.id !== over?.id) {
|
|
setDataSource((prev) => {
|
|
const activeIndex = prev.findIndex((i) => i.key === active.id);
|
|
const overIndex = prev.findIndex((i) => i.key === over?.id);
|
|
return arrayMove(prev, activeIndex, overIndex);
|
|
});
|
|
}
|
|
};
|
|
|
|
return (
|
|
<DndContext sensors={sensors} modifiers={[restrictToVerticalAxis]} onDragEnd={onDragEnd}>
|
|
<SortableContext
|
|
// rowKey array
|
|
items={dataSource.map((i) => i.key)}
|
|
strategy={verticalListSortingStrategy}
|
|
>
|
|
<Table<DataType>
|
|
components={{
|
|
body: { row: Row },
|
|
}}
|
|
rowKey="key"
|
|
columns={columns}
|
|
dataSource={dataSource}
|
|
/>
|
|
</SortableContext>
|
|
</DndContext>
|
|
);
|
|
};
|
|
|
|
export default App;
|