当前位置:首页 > React

react拖拽功能实现

2026-01-27 06:22:39React

实现React拖拽功能的方法

React中实现拖拽功能可以通过原生HTML5的拖拽API或第三方库完成。以下是两种主流方法的详细说明:

使用HTML5原生拖拽API

HTML5提供了draggableondragstartondragoverondrop等事件,适合基础需求。

react拖拽功能实现

import React, { useState } from 'react';

function DragExample() {
  const [items, setItems] = useState(['Item 1', 'Item 2']);
  const [draggedItem, setDraggedItem] = useState(null);

  const handleDragStart = (index) => {
    setDraggedItem(index);
  };

  const handleDragOver = (e) => {
    e.preventDefault(); // 必须阻止默认行为
  };

  const handleDrop = (targetIndex) => {
    const newItems = [...items];
    const [removed] = newItems.splice(draggedItem, 1);
    newItems.splice(targetIndex, 0, removed);
    setItems(newItems);
  };

  return (
    <div>
      {items.map((item, index) => (
        <div
          key={index}
          draggable
          onDragStart={() => handleDragStart(index)}
          onDragOver={handleDragOver}
          onDrop={() => handleDrop(index)}
          style={{ padding: '8px', margin: '4px', border: '1px solid #ccc' }}
        >
          {item}
        </div>
      ))}
    </div>
  );
}

关键点:

  • 设置draggable=true使元素可拖拽。
  • onDragOver必须调用e.preventDefault()以允许放置。
  • 通过状态管理更新元素顺序。

使用第三方库(如react-dnd或react-beautiful-dnd)

对于复杂场景(如跨组件拖拽、列表排序),推荐使用成熟的库。

react拖拽功能实现

react-dnd示例:

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

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

  const [, drop] = useDrop({
    accept: 'ITEM',
    hover: (draggedItem) => {
      if (draggedItem.id !== id) {
        moveItem(draggedItem.id, id);
      }
    },
  });

  return (
    <div
      ref={(node) => drag(drop(node))}
      style={{ opacity: isDragging ? 0.5 : 1 }}
    >
      {text}
    </div>
  );
}

react-beautiful-dnd示例:

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

function SortableList() {
  const [items, setItems] = useState(['A', 'B', 'C']);

  const onDragEnd = (result) => {
    if (!result.destination) return;
    const newItems = [...items];
    const [removed] = newItems.splice(result.source.index, 1);
    newItems.splice(result.destination.index, 0, removed);
    setItems(newItems);
  };

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

选择建议

  • 简单场景:原生API足够,无需额外依赖。
  • 复杂交互:使用react-beautiful-dnd(列表排序)或react-dnd(跨组件拖拽)。
  • 性能优化:第三方库通常内置了优化(如虚拟滚动支持)。

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

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

vue内实现拖拽

vue内实现拖拽

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template>…

php实现评论功能

php实现评论功能

数据库设计 创建评论表(示例结构): CREATE TABLE `comments` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id`…

vue 实现单选功能

vue 实现单选功能

实现单选功能的方法 在Vue中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML单选按钮 通过v-model绑定数据,结合原生<input type="radio"&g…

vue实现全选功能

vue实现全选功能

实现全选功能的基本思路 在Vue中实现全选功能通常需要绑定一个全选复选框的状态,并通过v-model或事件监听控制子选项的选中状态。核心逻辑包括全选按钮与子选项的双向数据绑定,以及状态同步。 数据准…

vue实现简单拖拽

vue实现简单拖拽

Vue 实现简单拖拽功能 在 Vue 中实现拖拽功能可以通过 HTML5 的拖放 API 或第三方库(如 vuedraggable)来完成。以下是两种常见的实现方式: 使用 HTML5 拖放 API…