当前位置:首页 > 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
分享给朋友:

相关文章

vue 实现拖拽

vue 实现拖拽

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

react如何销毁

react如何销毁

React 组件销毁的机制 在 React 中,组件的销毁通常由 React 的生命周期管理。当组件从 DOM 中移除时,React 会自动触发销毁相关的生命周期方法。以下是关键点: 组件的销毁通常…

react如何遍历

react如何遍历

遍历数组或对象的方法 在React中,遍历数组或对象通常用于渲染列表或动态生成内容。以下是几种常见的遍历方法: 使用map遍历数组map是遍历数组并返回新数组的高阶函数,适合渲染列表。…

react如何打包

react如何打包

打包 React 项目的基本步骤 React 项目通常使用 create-react-app 或类似的脚手架工具创建,这些工具内置了打包功能。以下是打包 React 项目的详细方法: 安装依赖并构建…

react就业如何

react就业如何

React 就业市场现状 React 作为当前主流前端框架之一,就业需求持续旺盛。国内外互联网企业、中大型公司以及初创团队普遍采用 React 技术栈,尤其在 Web 应用、移动端(React Nat…

vue实现拖拽div

vue实现拖拽div

实现拖拽功能的基本思路 在Vue中实现拖拽功能可以通过HTML5的拖拽API或第三方库如vuedraggable来完成。以下是两种常见方法的详细说明: 使用HTML5拖拽API HTML5提供了原生…