当前位置:首页 > React

react实现div的拖拽

2026-01-27 12:48:18React

实现拖拽的基本思路

在React中实现拖拽功能,通常利用HTML5的Drag and Drop API或第三方库(如react-dndreact-beautiful-dnd)。以下是两种方法的实现示例。

使用HTML5 Drag and Drop API

HTML5原生API适合简单场景,需通过事件监听实现拖拽逻辑。

定义拖拽元素
为可拖拽元素添加draggable属性,并监听onDragStart事件:

react实现div的拖拽

<div
  draggable
  onDragStart={(e) => {
    e.dataTransfer.setData("text/plain", "drag-item-id"); // 传递数据
  }}
>
  拖拽元素
</div>

定义放置区域
放置区域需监听onDragOver(阻止默认行为)和onDrop事件:

<div
  onDragOver={(e) => e.preventDefault()} // 必须阻止默认行为
  onDrop={(e) => {
    e.preventDefault();
    const itemId = e.dataTransfer.getData("text/plain");
    console.log("放置元素ID:", itemId);
  }}
>
  放置区域
</div>

完整组件示例

react实现div的拖拽

import React from "react";

function DragDemo() {
  return (
    <div>
      <div
        draggable
        onDragStart={(e) => e.dataTransfer.setData("text/plain", "item-1")}
        style={{ padding: "10px", background: "lightblue" }}
      >
        拖拽我
      </div>
      <div
        onDragOver={(e) => e.preventDefault()}
        onDrop={(e) => {
          e.preventDefault();
          alert(`接收到数据: ${e.dataTransfer.getData("text/plain")}`);
        }}
        style={{ padding: "20px", background: "lightgray", marginTop: "20px" }}
      >
        放置区域
      </div>
    </div>
  );
}

使用第三方库(react-dnd)

对于复杂场景(如排序列表),推荐使用react-dnd库。

安装依赖

npm install react-dnd react-dnd-html5-backend

实现拖拽排序

import React from "react";
import { DndProvider, useDrag, useDrop } from "react-dnd";
import { HTML5Backend } from "react-dnd-html5-backend";

const DraggableItem = ({ id, text, moveItem }) => {
  const [{ isDragging }, drag] = useDrag({
    type: "ITEM",
    item: { id },
    collect: (monitor) => ({
      isDragging: monitor.isDragging(),
    }),
  });

  const [, drop] = useDrop({
    accept: "ITEM",
    hover: (draggedItem) => {
      if (draggedItem.id !== id) {
        moveItem(draggedItem.id, id);
      }
    },
  });

  return (
    <div
      ref={(node) => drag(drop(node))}
      style={{
        opacity: isDragging ? 0.5 : 1,
        padding: "8px",
        margin: "4px",
        background: "lightgreen",
        cursor: "move",
      }}
    >
      {text}
    </div>
  );
};

function DragList() {
  const [items, setItems] = React.useState([
    { id: 1, text: "Item 1" },
    { id: 2, text: "Item 2" },
    { id: 3, text: "Item 3" },
  ]);

  const moveItem = (fromId, toId) => {
    const fromIndex = items.findIndex((item) => item.id === fromId);
    const toIndex = items.findIndex((item) => item.id === toId);
    const newItems = [...items];
    const [movedItem] = newItems.splice(fromIndex, 1);
    newItems.splice(toIndex, 0, movedItem);
    setItems(newItems);
  };

  return (
    <DndProvider backend={HTML5Backend}>
      {items.map((item) => (
        <DraggableItem
          key={item.id}
          id={item.id}
          text={item.text}
          moveItem={moveItem}
        />
      ))}
    </DndProvider>
  );
}

关键注意事项

  • 性能优化:频繁拖拽时,避免直接修改状态,可使用防抖或不可变数据。
  • 跨浏览器兼容性:HTML5 API在移动端支持有限,推荐使用库(如react-dnd)。
  • 无障碍支持:为拖拽元素添加aria-grabbed等ARIA属性。

通过上述方法,可灵活实现React中的拖拽功能,从简单到复杂场景均可覆盖。

标签: 拖拽react
分享给朋友:

相关文章

vue实现拖拽改变尺寸

vue实现拖拽改变尺寸

Vue 实现拖拽改变尺寸的方法 使用原生 HTML5 拖拽 API 通过监听 mousedown、mousemove 和 mouseup 事件实现拖拽调整尺寸。创建一个可拖拽的元素,计算鼠标移动距离并…

如何删除react

如何删除react

卸载 React 项目依赖 打开项目根目录下的 package.json 文件,删除所有包含 react、react-dom 或其他 React 相关库的依赖项。保存文件后运行以下命令: npm…

vue拖拽实现方式

vue拖拽实现方式

Vue拖拽实现方式 使用HTML5原生拖拽API HTML5提供了原生的拖拽API,可以通过draggable属性、dragstart、dragend、dragover和drop等事件实现基础拖拽功能…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 drag…

react如何开发组件

react如何开发组件

React 组件开发基础 React 组件分为函数组件和类组件两种形式。函数组件是现代 React 开发的主流方式,结合 Hooks 可以实现完整功能。 函数组件示例: function Gree…