使用react-dnd + react-dnd-html5-backend 实现节点拖动排序
import React, { useState } from 'react';
import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { Button } from 'antd';
import update from 'immutability-helper';
import { arrayMoveImmutable } from 'array-move-immutable';
const ItemTypes = { NODE: 'node' };
const Node = ({ id, text, moveNode, connectDragSource }) => {
return (
connectDragSource(
<div style={{ margin: '5px', padding: '5px', border: '1px solid #ccc' }}>
<Button type="link" onClick={() => moveNode(id, 'up')}>上移</Button>
<Button type="link" onClick={() => moveNode(id, 'down')}>下移</Button>
{text}
</div>
)
);
};
const NodeContainer = ({ id, text, index, moveNode }) => {
const [nodes, setNodes] = useState(initialData);
const moveNode = (id, direction) => {
const { currentIndex } = nodes.find(node => node.id === id);
const newIndex = direction === 'up' ? currentIndex - 1 : currentIndex + 1;
if (newIndex >= 0 && newIndex < nodes.length) {
setNodes(update(nodes, arrayMoveImmutable(nodes, currentIndex, newIndex)));
}
};
const nodeComponents = nodes.map((node, i) => (
<Node key={node.id} id={node.id} text={node.text} moveNode={moveNode} index={i} />
));
return (
<DndProvider backend={HTML5Backend}>
{nodeComponents}
</DndProvider>
);
};
export default NodeContainer;
这个代码实例使用了react-dnd
和react-dnd-html5-backend
库来实现一个简单的节点拖动排序功能。它定义了一个Node
组件,该组件用于渲染每个节点,并提供了上移和下移的按钮用于处理节点的移动。NodeContainer
组件维护了节点的状态,并渲染了一个节点列表,其中每个节点都可以被拖动。这个例子展示了如何使用React组件状态管理和react-dnd
的connectDragSource
方法来实现拖动功能。
评论已关闭