学堂 学堂 学堂公众号手机端

在React中实现拖拽自由布局可以使用HTML5的拖放API。以下是一个简单的实现示例

lewis 1年前 (2024-04-21) 阅读数 17 #技术

在React中实现拖拽自由布局可以使用HTML5的拖放API。以下是一个简单的实现示例:

首先,创建一个Draggable组件,用于包装可拖拽的元素:

importReactfrom'react';

constDraggable=({id,onDragStart,children})=>{
consthandleDragStart=(event)=>{
event.dataTransfer.setData('text/plain',id);
onDragStart(id);
};

return(
<div
draggable
onDragStart={handleDragStart}
style={{cursor:'move'}}
>
{children}
</div>
);
};

exportdefaultDraggable;

然后,在父组件中创建一个容器元素,并监听拖放事件:


importReact,{useState}from'react';
importDraggablefrom'./Draggable';

constFreeLayout=()=>{
const[draggedItem,setDraggedItem]=useState(null);
const[items,setItems]=useState([]);

consthandleDrop=(event)=>{
event.preventDefault();
constitemId=event.dataTransfer.getData('text/plain');
constnewItem={id:itemId,x:event.clientX,y:event.clientY};
setItems([...items,newItem]);
setDraggedItem(null);
};

consthandleDragOver=(event)=>{
event.preventDefault();
};

consthandleDragStart=(itemId)=>{
setDraggedItem(itemId);
};

return(
<div
onDrop={handleDrop}
onDragOver={handleDragOver}
style={{width:'500px',height:'500px',border:'1pxsolidblack'}}
>
{items.map((item)=>(
<div
key={item.id}
style={{
position:'absolute',
left:item.x,
top:item.y,
border:'1pxsolidred',
padding:'10px',
}}
>
{item.id}
</div>
))}
<Draggableid="item1"onDragStart={handleDragStart}>
Item1
</Draggable>
<Draggableid="item2"onDragStart={handleDragStart}>
Item2
</Draggable>
</div>
);
};

exportdefaultFreeLayout;

在上面的示例中,FreeLayout组件中的state用于存储已拖拽的元素的位置信息。Draggable组件用于封装可拖拽的元素,并在拖拽开始时触发回调函数。

在容器元素上监听drop和dragover事件,并在drop事件中获取拖拽的元素信息,并将其添加到state中。在拖拽元素上触发dragstart事件时,将元素的id存储在state中。

最后,根据state中的元素位置信息渲染拖拽的元素,并设置其位置为绝对定位。

这样就实现了一个简单的拖拽自由布局。你可以根据需求进行扩展和优化。

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门