|
1 | 1 | import React from 'react'; |
2 | | -import { DndProvider, DragSource, DropTarget } from 'react-dnd'; |
3 | | -import HTML5Backend from 'react-dnd-html5-backend'; |
| 2 | +import { DndProvider, useDrag, useDrop } from 'react-dnd'; |
| 3 | +import { HTML5Backend } from 'react-dnd-html5-backend'; |
4 | 4 | import Tabs from '@rc-component/tabs'; |
5 | 5 | import type { TabsProps } from '@rc-component/tabs'; |
6 | 6 | import '../../assets/index.less'; |
7 | 7 |
|
8 | 8 | // Drag & Drop node |
9 | | -class TabNode extends React.Component<any, any> { |
10 | | - render() { |
11 | | - const { connectDragSource, connectDropTarget, children } = this.props; |
12 | | - |
13 | | - return connectDragSource(connectDropTarget(children)); |
14 | | - } |
15 | | -} |
16 | | - |
17 | | -const cardTarget = { |
18 | | - drop(props, monitor) { |
19 | | - const dragKey = monitor.getItem().index; |
20 | | - const hoverKey = props.index; |
21 | | - |
22 | | - if (dragKey === hoverKey) { |
23 | | - return; |
24 | | - } |
| 9 | +const WrapTabNode: React.FC<any> = ({ children, index, moveTabNode }) => { |
| 10 | + const [, drop] = useDrop({ |
| 11 | + accept: 'DND_NODE', |
| 12 | + drop(item: { index: React.Key }) { |
| 13 | + const dragKey = item.index; |
| 14 | + const hoverKey = index; |
| 15 | + |
| 16 | + if (dragKey === hoverKey) { |
| 17 | + return; |
| 18 | + } |
25 | 19 |
|
26 | | - props.moveTabNode(dragKey, hoverKey); |
27 | | - monitor.getItem().index = hoverKey; |
28 | | - }, |
29 | | -}; |
| 20 | + moveTabNode(dragKey, hoverKey); |
| 21 | + item.index = hoverKey; |
| 22 | + }, |
| 23 | + }); |
| 24 | + const [, drag] = useDrag({ |
| 25 | + type: 'DND_NODE', |
| 26 | + item: { index }, |
| 27 | + }); |
30 | 28 |
|
31 | | -const cardSource = { |
32 | | - beginDrag(props) { |
33 | | - return { |
34 | | - id: props.id, |
35 | | - index: props.index, |
36 | | - }; |
37 | | - }, |
| 29 | + return drag(drop(children)); |
38 | 30 | }; |
39 | 31 |
|
40 | | -const WrapTabNode = DropTarget('DND_NODE', cardTarget, connect => ({ |
41 | | - connectDropTarget: connect.dropTarget(), |
42 | | -}))( |
43 | | - DragSource('DND_NODE', cardSource, (connect, monitor) => ({ |
44 | | - connectDragSource: connect.dragSource(), |
45 | | - isDragging: monitor.isDragging(), |
46 | | - }))(TabNode), |
47 | | -); |
48 | | - |
49 | 32 | class DraggableTabs extends React.Component<TabsProps> { |
50 | 33 | state = { |
51 | 34 | order: [], |
@@ -111,7 +94,6 @@ class DraggableTabs extends React.Component<TabsProps> { |
111 | 94 | }); |
112 | 95 |
|
113 | 96 | return ( |
114 | | - // @ts-ignore https://github.com/react-dnd/react-dnd/issues/3636 需要升级 15.0.0 类型支持 children 但是写法需要重新调整验证 |
115 | 97 | <DndProvider backend={HTML5Backend}> |
116 | 98 | <Tabs renderTabBar={this.renderTabBar} {...this.props} items={orderTabs} /> |
117 | 99 | </DndProvider> |
|
0 commit comments