当前位置:首页 > React

React实现拖拽功能

2026-01-26 23:34:38React

使用 React DnD 实现拖拽

React DnD 是一个流行的拖拽库,适合复杂场景。安装依赖:

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 }}>
      {text}
    </div>
  );
}

创建放置目标:

import { useDrop } from 'react-dnd';

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

  return (
    <div ref={drop} style={{ background: isOver ? 'lightgreen' : 'white' }}>
      Drop here
    </div>
  );
}

使用原生 HTML5 拖拽 API

简单场景可用原生 API 实现。拖拽元素设置:

function Draggable() {
  const handleDragStart = (e) => {
    e.dataTransfer.setData('text/plain', 'drag-data');
  };

  return (
    <div draggable onDragStart={handleDragStart}>
      Drag me
    </div>
  );
}

放置区域处理:

function DropZone() {
  const handleDrop = (e) => {
    e.preventDefault();
    const data = e.dataTransfer.getData('text/plain');
    console.log('Dropped:', data);
  };

  return (
    <div 
      onDrop={handleDrop}
      onDragOver={(e) => e.preventDefault()}
    >
      Drop here
    </div>
  );
}

使用 react-beautiful-dnd 实现列表排序

适用于列表重排序场景。安装库:

npm install react-beautiful-dnd

实现可排序列表:

React实现拖拽功能

import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';

function SortableList({ items, onReorder }) {
  const handleDragEnd = (result) => {
    if (!result.destination) return;
    onReorder(result.source.index, result.destination.index);
  };

  return (
    <DragDropContext onDragEnd={handleDragEnd}>
      <Droppable droppableId="list">
        {(provided) => (
          <div {...provided.droppableProps} ref={provided.innerRef}>
            {items.map((item, index) => (
              <Draggable key={item.id} draggableId={item.id} index={index}>
                {(provided) => (
                  <div
                    ref={provided.innerRef}
                    {...provided.draggableProps}
                    {...provided.dragHandleProps}
                  >
                    {item.content}
                  </div>
                )}
              </Draggable>
            ))}
            {provided.placeholder}
          </div>
        )}
      </Droppable>
    </DragDropContext>
  );
}

标签: 拖拽功能
分享给朋友:

相关文章

vue实现功能插件

vue实现功能插件

Vue 插件实现方法 Vue 插件通常用于封装全局功能(如指令、过滤器、混入等),以下是实现 Vue 插件的典型方式: 插件基本结构 const MyPlugin = { install(Vu…

vue 实现卡片拖拽

vue 实现卡片拖拽

Vue 实现卡片拖拽 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop…

vue实现倍速播放功能

vue实现倍速播放功能

实现倍速播放功能的方法 在Vue中实现倍速播放功能通常涉及HTML5的<video>元素或第三方播放器库(如video.js)的API调用。以下是具体实现方式: 使用原生HTML5 vi…

h5实现点击复制功能

h5实现点击复制功能

使用document.execCommand方法(兼容旧浏览器) 通过document.execCommand('copy')实现复制功能,需先选中文本内容。创建一个隐藏的textarea或input…

vue实现app功能

vue实现app功能

Vue 实现 App 功能的常见方法 使用 Capacitor 或 Cordova 进行混合开发 Vue 结合 Capacitor 或 Cordova 可以将 Web 应用打包成原生 App。Capa…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…