React UI

Advanced Drag and Drop

Multi-container sorting, drag previews, drop indicators, and touch support.

Advertisement

Advanced Drag and Drop

Multi-container sorting, drag previews, drop indicators, and touch support.

Overview

Advanced DnD patterns enable complex interfaces like kanban boards and file managers.

Key Concepts

  • Multi-Container — Drag items between containers
  • Drag Previews — Custom preview during drag
  • Drop Indicators — Visual feedback for drop targets
  • Touch Support — Mobile-friendly drag and drop
  • Animate on Drop — Smooth animations when items settle

Code Examples

import { DndContext, DragOverlay, closestCorners } from '@dnd-kit/core';
import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';

function KanbanBoard({ columns, onMoveCard }) {
  const [activeCard, setActiveCard] = useState(null);

  const handleDragStart = (event) => {
    setActiveCard(event.active.data.current.card);
  };

  const handleDragEnd = (event) => {
    const { active, over } = event;
    setActiveCard(null);
    
    if (over) {
      const sourceColumn = active.data.current.columnId;
      const destColumn = over.data.current?.columnId || over.id;
      onMoveCard(active.id, sourceColumn, destColumn);
    }
  };

  return (
    <DndContext
      collisionDetection={closestCorners}
      onDragStart={handleDragStart}
      onDragEnd={handleDragEnd}
    >
      <div className="board">
        {columns.map(column => (
          <Column key={column.id} column={column} />
        ))}
      </div>
      <DragOverlay>
        {activeCard && <Card card={activeCard} />}
      </DragOverlay>
    </DndContext>
  );
}

function Column({ column }) {
  return (
    <div className="column" data-column-id={column.id}>
      <h3>{column.title}</h3>
      <SortableContext items={column.cards.map(c => c.id)} strategy={verticalListSortingStrategy}>
        <div className="card-list">
          {column.cards.map(card => (
            <SortableCard key={card.id} card={card} columnId={column.id} />
          ))}
        </div>
      </SortableContext>
    </div>
  );
}

Practice

Build a multi-container sortable list with custom drag previews.