当前位置:首页 > React

react dnd如何使用

2026-02-26 12:04:07React

React DnD 基础用法

React DnD 是一个用于实现拖放功能的 React 库。以下是一个基本的使用示例:

安装 React DnD 和 HTML5 后端:

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

创建一个可拖动的组件:

import { useDrag } from 'react-dnd';

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

  return (
    <div
      ref={drag}
      style={{
        opacity: isDragging ? 0.5 : 1,
        cursor: 'move',
      }}
    >
      {text}
    </div>
  );
}

创建一个可放置的区域:

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 ? 'lightblue' : 'white',
        padding: '20px',
        border: '1px dashed gray',
      }}
    >
      放置区域
    </div>
  );
}

使用 DnD 提供者

在应用顶层设置 DnD 提供者:

react dnd如何使用

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

function App() {
  const [items, setItems] = useState([
    { id: 1, text: '项目1' },
    { id: 2, text: '项目2' },
  ]);

  const handleDrop = (id) => {
    console.log(`项目 ${id} 被放置`);
  };

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

自定义拖拽预览

可以创建自定义的拖拽预览:

import { DragPreviewImage, useDrag } from 'react-dnd';

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

  return (
    <>
      <DragPreviewImage connect={preview} src="path/to/image.png" />
      <div ref={drag} style={{ opacity: isDragging ? 0.5 : 1 }}>
        {text}
      </div>
    </>
  );
}

处理复杂数据类型

当需要拖拽复杂数据时:

const [{ isDragging }, drag] = useDrag(() => ({
  type: 'COMPLEX_ITEM',
  item: {
    id: 123,
    data: {
      name: '示例',
      value: 42,
    },
  },
}));

触摸设备支持

对于触摸设备,需要使用触摸后端:

react dnd如何使用

npm install react-dnd-touch-backend

然后修改提供者:

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

function App() {
  return (
    <DndProvider backend={TouchBackend} options={{ enableMouseEvents: true }}>
      {/* 应用内容 */}
    </DndProvider>
  );
}

性能优化

对于大量可拖拽项目,使用 memoization 优化性能:

const DraggableItem = React.memo(function DraggableItem({ id, text }) {
  // 拖拽逻辑
});

类型定义

使用 TypeScript 时定义拖拽项类型:

interface DragItem {
  id: number;
  type: string;
}

const [{ isDragging }, drag] = useDrag<DragItem, void, { isDragging: boolean }>(() => ({
  type: 'ITEM',
  item: { id: 1, type: 'EXAMPLE' },
  collect: (monitor) => ({
    isDragging: monitor.isDragging(),
  }),
}));

分享给朋友:

相关文章

react如何销毁

react如何销毁

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

react如何打包

react如何打包

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

react如何下载

react如何下载

安装 React 的步骤 通过 npm 或 yarn 安装 React,确保已安装 Node.js(版本建议 ≥ 14.0.0)。打开终端或命令行工具,运行以下命令: npx create-reac…

react如何启动

react如何启动

启动 React 项目的步骤 确保已安装 Node.js React 需要 Node.js 环境运行,建议安装最新稳定版(LTS)。可通过以下命令检查是否已安装: node -v npm -v…

react 如何操作cookie

react 如何操作cookie

安装依赖 在React项目中操作cookie通常需要第三方库的支持,推荐使用js-cookie。通过npm或yarn安装: npm install js-cookie # 或 yarn add js…

如何设计react组件

如何设计react组件

设计 React 组件的核心原则 React 组件的设计需要遵循高内聚、低耦合的原则,确保组件功能独立且易于维护。组件的设计可以分为展示组件和容器组件两类,展示组件负责 UI 渲染,容器组件负责逻辑处…