Drag-and-drop functionality can enhance user interactions by allowing elements to be moved dynamically within a UI. In this guide, we'll explore how to implement drag-and-drop using DnD Kit, a lightweight and flexible React library.
🏗 Why Use DnD Kit?
DnD Kit offers:
✅ A modern, unopinionated API for drag-and-drop.
✅ Lightweight (smaller than alternatives like react-beautiful-dnd).
✅ Keyboard support for accessibility.
✅ Customizable sensors (mouse, touch, and keyboard).
Let's dive into the setup and implementation!
🚀 Setting Up DnD Kit
First, install DnD Kit:
npm install @dnd-kit/core
or with Yarn:
yarn add @dnd-kit/core
🛠 Basic Drag-and-Drop Example
We’ll create a simple example where users can drag and drop items between two lists.
1️⃣ Setting Up the Context
In DnD Kit, we wrap our app with a DndContext, which manages drag-and-drop events.
import React, { useState } from "react"; import { DndContext } from "@dnd-kit/core"; function App() { const [items, setItems] = useState(["Item 1", "Item 2", "Item 3"]); return ( <DndContext> <div> {items.map((item, index) => ( <div key={index}>{item}</div> ))} </div> </DndContext> ); } export default App;
At this stage, nothing is draggable yet. Next, we’ll make the items draggable.
2️⃣ Making Items Draggable
To make items draggable, we use useDraggable from @dnd-kit/core.
import { useDraggable } from "@dnd-kit/core"; function DraggableItem({ id, children }) { const { attributes, listeners, setNodeRef, transform } = useDraggable({ id, }); const style = { transform: transform ? `translate(${transform.x}px, ${transform.y}px)` : undefined, }; return ( <div ref={setNodeRef} {...listeners} {...attributes} style={style}> {children} </div> ); }
Then, update App.js to use DraggableItem:
<DndContext> {items.map((item, index) => ( <DraggableItem key={index} id={index}> {item} </DraggableItem> ))} </DndContext>
Now, items can be dragged but not yet dropped!
3️⃣ Enabling Droppable Areas
To allow items to be dropped, use the useDroppable hook:
import { useDroppable } from "@dnd-kit/core"; function DroppableArea({ id, children }) { const { setNodeRef } = useDroppable({ id }); return ( <div ref={setNodeRef} style={{ padding: 20, border: "2px dashed #ccc" }}> {children} </div> ); }
Wrap DraggableItem inside DroppableArea:
<DndContext> <DroppableArea id="drop-zone"> {items.map((item, index) => ( <DraggableItem key={index} id={index}> {item} </DraggableItem> ))} </DroppableArea> </DndContext>
4️⃣ Handling Drag Events
To update state when an item is dropped, use onDragEnd inside DndContext:
function App() { const [items, setItems] = useState(["Item 1", "Item 2", "Item 3"]); function handleDragEnd(event) { const { active, over } = event; if (over && active.id !== over.id) { setItems((prev) => { const updatedItems = [...prev]; const [movedItem] = updatedItems.splice(active.id, 1); updatedItems.splice(over.id, 0, movedItem); return updatedItems; }); } } return ( <DndContext onDragEnd={handleDragEnd}> <DroppableArea id="drop-zone"> {items.map((item, index) => ( <DraggableItem key={index} id={index}> {item} </DraggableItem> ))} </DroppableArea> </DndContext> ); }
Now, when an item is dropped, the list updates dynamically! 🎉
🎨 Styling the Drag Effect
To enhance the UI, apply styles:
.draggable { padding: 10px; margin: 5px; background: #f4f4f4; border-radius: 5px; cursor: grab; }
🔥 Advanced Features to Explore
• Sorting Lists → @dnd-kit/sortable
• Drag Constraints → Limit draggable areas
• Custom Animations → Smooth transitions
• Keyboard Accessibility → Improve usability
🏁 Wrapping Up
DnD Kit is a lightweight, flexible solution for adding drag-and-drop to React apps. By using DndContext, useDraggable, and useDroppable, you can create interactive and accessible interfaces with minimal effort.
🚀 Try it out in your next project!
💬 Have questions? Drop a comment below!
💡 If you found this helpful, share it and follow me for more React content! 🚀
Top comments (0)