当前位置:首页 > React

react拖拽实现

2026-01-26 11:28:23React

实现拖拽的基本步骤

安装依赖库react-dndreact-dnd-html5-backend

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

创建可拖拽组件需要使用useDrag钩子:

import { useDrag } from 'react-dnd';

function DraggableItem({ item }) {
  const [{ isDragging }, drag] = useDrag(() => ({
    type: 'ITEM',
    item: { id: item.id },
    collect: (monitor) => ({
      isDragging: !!monitor.isDragging(),
    }),
  }));

  return (
    <div ref={drag} style={{ opacity: isDragging ? 0.5 : 1 }}>
      {item.content}
    </div>
  );
}

创建放置区域

使用useDrop钩子实现放置区域:

import { useDrop } from 'react-dnd';

function DropZone({ onDrop }) {
  const [{ isOver }, drop] = useDrop(() => ({
    accept: 'ITEM',
    drop: (item) => onDrop(item.id),
    collect: (monitor) => ({
      isOver: !!monitor.isOver(),
    }),
  }));

  return (
    <div ref={drop} style={{ backgroundColor: isOver ? 'lightgreen' : 'white' }}>
      放置区域
    </div>
  );
}

组合组件并管理状态

在父组件中管理拖拽状态:

react拖拽实现

import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';

function App() {
  const [items, setItems] = useState([...]);
  const [droppedItems, setDroppedItems] = useState([]);

  const handleDrop = (id) => {
    const item = items.find(i => i.id === id);
    setDroppedItems([...droppedItems, item]);
  };

  return (
    <DndProvider backend={HTML5Backend}>
      <div>
        {items.map(item => (
          <DraggableItem key={item.id} item={item} />
        ))}
        <DropZone onDrop={handleDrop} />
      </div>
    </DndProvider>
  );
}

高级自定义选项

实现自定义拖拽预览:

const [{ isDragging }, drag, preview] = useDrag(() => ({
  type: 'ITEM',
  item: { id },
}));

return (
  <>
    <div ref={preview} style={{ position: 'absolute', opacity: 0 }}>
      预览内容
    </div>
    <div ref={drag}>实际内容</div>
  </>
);

添加拖拽限制条件:

react拖拽实现

useDrop(() => ({
  accept: 'ITEM',
  canDrop: (item) => item.type === 'ALLOWED_TYPE',
  drop: (item) => {...},
}));

触摸设备支持

对于移动设备,需要安装react-dnd-touch-backend

npm install react-dnd-touch-backend

然后替换backend:

import { TouchBackend } from 'react-dnd-touch-backend';

<DndProvider backend={TouchBackend} options={{ enableMouseEvents: true }}>
  ...
</DndProvider>

性能优化建议

对于大量可拖拽项,使用useMemo优化:

const items = useMemo(() => data.map(item => (
  <DraggableItem key={item.id} item={item} />
)), [data]);

避免不必要的重渲染,将拖拽逻辑与展示组件分离。

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

相关文章

react native如何启动

react native如何启动

React Native 启动步骤 确保已安装 Node.js(建议版本 14 或更高)和 npm/yarn。安装完成后,通过命令行工具执行以下操作。 初始化新项目 使用 React Native…

react如何使用

react如何使用

React 的基本使用 React 是一个用于构建用户界面的 JavaScript 库,以下是一些核心概念和使用方法。 安装 React 通过 create-react-app 快速搭建 Reac…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 在项目根目录的 package.json 文件中查看 dependencies 或 devDependencies 下的 react 和…

js实现拖拽

js实现拖拽

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

vue实现拖拽改变尺寸

vue实现拖拽改变尺寸

Vue 实现拖拽改变尺寸的方法 使用原生 HTML5 拖拽 API 通过监听 mousedown、mousemove 和 mouseup 事件实现拖拽改变尺寸。创建一个可拖拽的边界元素,调整目标元素的…

react native 如何

react native 如何

React Native 开发基础 React Native 是一个用于构建跨平台移动应用的框架,允许开发者使用 JavaScript 和 React 编写代码,同时生成原生 iOS 和 Androi…