up:: React

droppableとdraggableのセットで入力できる。

大体

useDndContext内で、

useDroppable

const {setNodeRef} = useDroppable({
  id: props.id,
  data: {
    index: props.index,
  },
});

id:ドロップエリアの識別子
data:ドロップエリアが受け付けるデータ

Sortable

import React from 'react';
import {
  DndContext,
  closestCenter,
  PointerSensor,
  useSensor,
  useSensors,
} from '@dnd-kit/core';
import {
  arrayMove,
  SortableContext,
  sortableKeyboardCoordinates,
  useSortable,
  verticalListSortingStrategy,
} from '@dnd-kit/sortable';
import {CSS} from '@dnd-kit/utilities';
 
function SortableItem(props) {
  const {attributes, listeners, setNodeRef, transform, transition} = useSortable({id: props.id});
  const style = {
    transform: CSS.Transform.toString(transform),
    transition,
    padding: '8px',
    border: '1px solid #ccc',
    marginBottom: '4px',
    backgroundColor: '#fff',
  };
 
  return (
    <div ref={setNodeRef} style={style} {...attributes} {...listeners}>
      {props.id}
    </div>
  );
}
 
function App() {
//itemsにItem入力
  const [items, setItems] = React.useState(['Item 1', 'Item 2', 'Item 3', 'Item 4']);
  const sensors = useSensors(
    useSensor(PointerSensor, {
      activationConstraint: {
        distance: 5,
      },
    })
  );
 
  const handleDragEnd = (event) => {
    const {active, over} = event;
 
    if (active.id !== over.id) {
      setItems((items) => {
        const oldIndex = items.indexOf(active.id);
        const newIndex = items.indexOf(over.id);
 
        return arrayMove(items, oldIndex, newIndex);
      });
    }
  };
 
  return (
    <DndContext
      sensors={sensors}
      collisionDetection={closestCenter}
      onDragEnd={handleDragEnd}
    >
      <SortableContext
      //Appの最初で入れたitemsをSortableに渡す
        items={items}
        strategy={verticalListSortingStrategy}
      >
        {items.map((id) => (
          <SortableItem key={id} id={id} />
        ))}
      </SortableContext>
    </DndContext>
  );
}
 
export default App;