react-beautiful-dnd, react-easy-sort, react-sortable-hoc, and react-sortable-tree are React libraries that enable drag-and-drop and reordering functionality, but they target different interaction models. react-beautiful-dnd provides polished, accessible drag-and-drop for flat lists and multi-container scenarios like Kanban boards. react-easy-sort offers a minimal, hooks-based solution for simple single-container reordering. react-sortable-hoc (now deprecated) used higher-order components to add sorting behavior to any list but relies on outdated React patterns. react-sortable-tree specializes in interactive, nested tree structures such as file explorers or organizational charts, supporting drag-and-drop between hierarchical nodes.
When building interactive UIs in React — like task boards, reorderable lists, or nested tree editors — you’ll likely need a library to handle drag-and-drop (DnD) and sorting. The ecosystem offers several options, each with different strengths, constraints, and design philosophies. Let’s compare four popular packages: react-beautiful-dnd, react-easy-sort, react-sortable-hoc, and react-sortable-tree.
react-beautiful-dnd is built for vertical or horizontal lists with rich DnD interactions. It supports keyboard navigation, auto-scrolling, and smooth animations. Best suited for Kanban boards, playlists, or any flat list where items can be reordered or moved between containers.
react-easy-sort focuses on minimalist, lightweight reordering of items within a single container using mouse or touch. It doesn’t support cross-container dragging but excels at simple “reorder this list” use cases without heavy dependencies.
react-sortable-hoc is a higher-order component (HOC) that wraps any component to make it sortable. It supports both vertical and horizontal lists, multiple containers, and custom rendering. However, it relies on legacy React patterns (class components, HOCs) and hasn’t kept pace with modern hooks-based architecture.
react-sortable-tree is specialized for interactive, nested tree structures — like file explorers, org charts, or category hierarchies. It supports drag-and-drop between nodes, expand/collapse, and deep nesting, but isn’t meant for flat lists.
⚠️ Deprecation Note: As of 2023,
react-sortable-hocis officially deprecated. Its GitHub repo states: “This project is no longer maintained. We recommend using @dnd-kit/sortable instead.” New projects should avoid it.
react-beautiful-dnd requires wrapping your app in a DragDropContext, then using Droppable and Draggable components:
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
function TaskList({ tasks, onDragEnd }) {
return (
<DragDropContext onDragEnd={onDragEnd}>
<Droppable droppableId="tasks">
{(provided) => (
<ul {...provided.droppableProps} ref={provided.innerRef}>
{tasks.map((task, index) => (
<Draggable key={task.id} draggableId={task.id} index={index}>
{(provided) => (
<li
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
>
{task.content}
</li>
)}
</Draggable>
))}
{provided.placeholder}
</ul>
)}
</Droppable>
</DragDropContext>
);
}
react-easy-sort uses a simpler hook-like pattern with a useSortable function and a wrapper component:
import { useSortable, SortableContainer, SortableItem } from 'react-easy-sort';
function SimpleList({ items, onChange }) {
const { items: sortedItems, onSortEnd } = useSortable(items, onChange);
return (
<SortableContainer onSortEnd={onSortEnd}>
{sortedItems.map((item) => (
<SortableItem key={item.id}>
<div>{item.name}</div>
</SortableItem>
))}
</SortableContainer>
);
}
react-sortable-hoc (deprecated) wraps components via HOCs:
import { SortableContainer, SortableElement } from 'react-sortable-hoc';
const SortableItem = SortableElement(({ value }) => <li>{value}</li>);
const SortableList = SortableContainer(({ items }) => (
<ul>
{items.map((item, index) => (
<SortableItem key={`item-${index}`} index={index} value={item} />
))}
</ul>
));
// Usage
<SortableList items={items} onSortEnd={onSortEnd} />
react-sortable-tree is not designed for flat lists — attempting to use it here would be overkill and awkward.
Only react-sortable-tree handles this natively:
import SortableTree from 'react-sortable-tree';
function OrgChart({ treeData, onChange }) {
return (
<SortableTree
treeData={treeData}
onChange={onChange}
canDrag={({ node }) => !node.isLocked}
canDrop={({ nextParent }) => nextParent && !nextParent.isReadOnly}
/>
);
}
The other libraries cannot represent hierarchical relationships or allow dragging between nested levels.
Moving items between separate lists (e.g., “To Do” → “Done”) is common in task apps.
react-beautiful-dnd supports this out of the box by giving each Droppable a unique droppableId and handling the move logic in onDragEnd:
const onDragEnd = (result) => {
const { source, destination } = result;
if (!destination) return;
if (source.droppableId === destination.droppableId) {
// Reorder within same list
} else {
// Move between lists
}
};
react-easy-sort does not support cross-container dragging — all items must live in one SortableContainer.
react-sortable-hoc supports it via the group prop or by managing multiple sortable lists manually, but again, it’s deprecated.
react-sortable-tree allows moving nodes between branches of the same tree, but not between entirely separate trees or flat lists.
react-beautiful-dnd includes keyboard navigation, screen reader support, and smooth drop animations. It also auto-scrolls when dragging near container edges.
react-easy-sort provides basic mouse/touch support but lacks built-in keyboard accessibility or advanced UX features.
react-sortable-hoc leaves accessibility entirely up to the developer.
react-sortable-tree includes expand/collapse toggles and visual indentation but minimal ARIA support.
react-beautiful-dnd: Works with modern React but uses render props instead of hooks. Still actively maintained.react-easy-sort: Built with hooks and functional components. Lightweight and modern.react-sortable-hoc: Relies on class components and HOCs — incompatible with React Server Components and discouraged in new codebases.react-sortable-tree: Uses class components internally; works in most client-side apps but not optimized for concurrent mode.react-beautiful-dndreact-easy-sortreact-sortable-treereact-sortable-hoc unless absolutely necessary. Migrate to @dnd-kit or react-beautiful-dnd.| Feature | react-beautiful-dnd | react-easy-sort | react-sortable-hoc | react-sortable-tree |
|---|---|---|---|---|
| Flat List Sorting | ✅ Excellent | ✅ Good (single container) | ✅ Good (deprecated) | ❌ Not intended |
| Cross-Container Drag | ✅ Yes | ❌ No | ✅ Yes (deprecated) | ⚠️ Within same tree only |
| Nested Trees | ❌ No | ❌ No | ❌ No | ✅ Excellent |
| Keyboard Accessibility | ✅ Full support | ❌ None | ❌ None | ⚠️ Partial |
| Modern React (Hooks) | ⚠️ Render props | ✅ Hooks | ❌ Class/HOC | ⚠️ Class-based |
| Maintenance Status | ✅ Actively maintained | ✅ Actively maintained | ❌ Deprecated | ✅ Maintained (niche use) |
react-beautiful-dnd.react-easy-sort.react-sortable-tree.react-sortable-hoc — it’s deprecated and out of step with modern React practices.Each library solves a specific problem well. Pick the one that matches your UI’s structure — not the one with the most stars.
Choose react-beautiful-dnd when you need a robust, production-ready drag-and-drop experience for flat lists or multi-container layouts like task boards. It includes keyboard navigation, smooth animations, and auto-scrolling, making it ideal for applications where UX polish and accessibility are critical. Avoid it if you’re working with deeply nested tree structures or need an ultra-lightweight solution.
Choose react-easy-sort for simple, single-container reordering with minimal overhead. It’s perfect for settings pages, small admin panels, or any scenario where you just need to reorder items in one list without cross-container moves. Don’t use it if you require keyboard accessibility, multi-list interactions, or complex drag behaviors.
Do not choose react-sortable-hoc for new projects — it is officially deprecated and unmaintained. While it once provided flexible sorting via higher-order components, its reliance on class-based patterns makes it incompatible with modern React best practices. If you encounter it in legacy code, plan a migration to react-beautiful-dnd or @dnd-kit.
Choose react-sortable-tree exclusively when your UI requires interactive, nested tree structures — such as file browsers, category editors, or org charts. It supports drag-and-drop between nodes, expand/collapse toggles, and deep hierarchy visualization. Avoid it for flat lists or general-purpose DnD, as it’s over-engineered for those use cases.
This library continues to be relied upon heavily by Atlassian products, but we are focused on other priorities right now and have no current plans for further feature development or improvements.
It will continue to be here on GitHub and we will still make critical updates (e.g. security fixes, if any) as required, but will not be actively monitoring or replying to issues and pull requests.
We recommend that you don’t raise issues or pull requests, as they will not be reviewed or actioned until further notice.
We have created a free course on egghead.io 🥚 to help you get started with react-beautiful-dnd as quickly as possible.
<table> reordering - table pattern<Draggable />@atlaskit/tree package<Droppable /> list can be a scroll container (without a scrollable parent) or be the child of a scroll container (that also does not have a scrollable parent)react-beautiful-dnd exists to create beautiful drag and drop for lists that anyone can use - even people who cannot see. For a good overview of the history and motivations of the project you can take a look at these external resources:
There are a lot of libraries out there that allow for drag and drop interactions within React. Most notable of these is the amazing react-dnd. It does an incredible job at providing a great set of drag and drop primitives which work especially well with the wildly inconsistent html5 drag and drop feature. react-beautiful-dnd is a higher level abstraction specifically built for lists (vertical, horizontal, movement between lists, nested lists and so on). Within that subset of functionality react-beautiful-dnd offers a powerful, natural and beautiful drag and drop experience. However, it does not provide the breadth of functionality offered by react-dnd. So react-beautiful-dnd might not be for you depending on what your use case is.
The ways in which somebody can start and control a drag

<DragDropContext /> - Wraps the part of your application you want to have drag and drop enabled for<Droppable /> - An area that can be dropped into. Contains <Draggable />s<Draggable /> - What can be dragged aroundresetServerContext() - Utility for server side rendering (SSR)<DragDropContext /> responders - onDragStart, onDragUpdate, onDragEnd and onBeforeDragStart<Draggable />sinnerRefdraggableId and droppableIdsdoctypeTypeScript and flow: type information<svg>sreact-beautiful-dnd<Draggable />s during a drag (11.x behaviour) - ⚠️ Advanced<Draggable /> - Using our cloning API or your own portalAlex Reardon @alexandereardon
Alex is no longer personally maintaning this project. The other wonderful maintainers are carrying this project forward.