当前位置:首页 > 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 native 如何

react native 如何

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

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: nod…

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高:基于 JavaScript 和 React 语法,可同时开发 iOS 和 Android 应用,减少重复代码量。性能接近原生:通过原生组件渲染,性能…

java如何使用

java如何使用

Java 基本使用方法 Java 是一种广泛使用的编程语言,适用于开发各种类型的应用程序。以下是 Java 的基本使用方法,包括环境配置、语法基础和常用操作。 安装 Java 开发环境 下载并安装…

如何下载react

如何下载react

下载 React 的方法 通过 npm 或 yarn 安装 React 可以通过包管理器 npm 或 yarn 安装。确保已安装 Node.js(包含 npm),然后在项目目录中运行以下命令:…

react如何查

react如何查

React 查询方法 React 提供了多种查询 DOM 元素的方式,以下是几种常见的方法: 使用 ref 通过 useRef 钩子可以获取 DOM 节点的引用,适用于直接操作 DOM 的场景。…