当前位置:首页 > 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 分页功能实现 在 Vue 中实现分页功能通常需要结合后端 API 或前端数据分页逻辑。以下是两种常见的实现方式: 前端分页实现 适用于数据量较小的情况,直接在 Vue 组件中处理分页逻辑。…

vue实现审核功能

vue实现审核功能

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

vue实现拖拽div

vue实现拖拽div

实现拖拽功能的基本思路 在Vue中实现拖拽功能可以通过HTML5的拖拽API或第三方库如vuedraggable来完成。以下是两种常见方法的详细说明: 使用HTML5拖拽API HTML5提供了原生…

vue实现论坛功能

vue实现论坛功能

实现论坛功能的核心模块 论坛功能通常包含用户发帖、回帖、分类浏览、搜索等核心模块。Vue.js 作为前端框架,需配合后端 API 实现数据交互。 基础项目结构搭建 使用 Vue CLI 或 Vite…

vue实现模态功能

vue实现模态功能

Vue 实现模态框功能 方法一:使用组件和v-if/v-show控制显示 创建独立的模态框组件(如Modal.vue),通过props接收标题、内容等数据,使用v-if或v-show控制显示状态。…

利用vue实现拖拽

利用vue实现拖拽

使用 Vue 实现拖拽功能 原生 HTML5 拖拽 API Vue 可以结合 HTML5 的拖拽 API 实现基础拖拽功能。以下是一个简单示例: <template> <div…