当前位置:首页 > 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(跨组件拖拽)。
  • 性能优化:第三方库通常内置了优化(如虚拟滚动支持)。

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

相关文章

vue实现拖拽计算器

vue实现拖拽计算器

Vue 拖拽计算器实现方案 核心功能分析 可拖拽组件:计算器整体或按钮需要支持拖拽 2.计算逻辑:实现基本四则运算功能 布局系统:支持动态调整计算器位置 基础实现步骤 安装依赖 需要vue-dragg…

vue 实现卡片拖拽

vue 实现卡片拖拽

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

vue拖拽容器实现

vue拖拽容器实现

实现 Vue 拖拽容器的基本方法 使用 HTML5 原生拖拽 API 通过 draggable 属性和拖拽事件(dragstart、dragend、dragover、drop)实现基础拖拽功能。适用于…

vue实现答题功能

vue实现答题功能

Vue实现答题功能的基本思路 在Vue中实现答题功能通常需要以下几个核心模块:题目数据管理、用户交互处理、答题状态跟踪和结果计算。通过组件化开发可以更好地组织代码结构。 数据结构设计 答题功能的基…

vue修改功能实现

vue修改功能实现

Vue 修改功能的实现方法 在 Vue 中实现修改功能通常涉及表单绑定、数据更新和事件处理。以下是几种常见的实现方式: 数据双向绑定 使用 v-model 指令实现表单元素与 Vue 实例数据的双向…

vue实现审核功能

vue实现审核功能

实现审核功能的基本思路 审核功能通常涉及状态管理、权限控制和操作记录。Vue中可以通过组件化设计、状态管理库(如Vuex或Pinia)和后端API配合实现。 审核状态管理 使用Vuex或Pinia存…