
Research
Security News
The Growing Risk of Malicious Browser Extensions
Socket researchers uncover how browser extensions in trusted stores are used to hijack sessions, redirect traffic, and manipulate user behavior.
react-native-reanimated-dnd
Advanced tools
A powerful drag-and-drop library for React Native using Reanimated 3
A drag-and-drop library that finally works on React Native ✨
Powerful, performant, and built for the modern React Native developer
After countless attempts with drag-and-drop solutions that don't work or are simply outdated, this is something that finally works. And it is not just another DnD library, but a complete ecosystem built from the ground up for React Native, offering a best-in-class developer experience and production-ready performance.
Highly feature-packed with every interaction pattern you'll ever need, yet simple enough to get started in minutes. Built for developers who demand both power and simplicity.
See it in action! A comprehensive example app with 15 interactive demos showcasing every feature and use case.
📱 Scan & Play Scan with your camera or Expo Go app |
🚀 Quick Start
Or browse the code: 📂 View Example App → |
Comprehensive guides, API reference, and interactive examples
The example app includes:
See the library in action with these demos showcasing some of the key features and use cases.
📋 Sortable ListsDrag and drop to reorder items with smooth animations https://github.com/user-attachments/assets/1cd1929c-724b-4dda-a916-f3e69f917f7b Features: Auto-scrolling • Drag handles • Smooth transitions |
🎯 Collision DetectionMultiple algorithms for precise drop targeting https://github.com/user-attachments/assets/379040d7-8489-430b-bae4-3fcbde34264e Algorithms: Center • Intersect • Contain |
🎪 Drag HandlesPrecise control with dedicated drag areas https://github.com/user-attachments/assets/ec051d5b-8ba0-41b7-86ae-379de26a97dd Features: Touch-friendly • Visual feedback • Accessibility |
📦 Bounded DraggingConstrain movement within specific boundaries https://github.com/user-attachments/assets/7bd5045b-47c4-4d9b-a0c5-eb89122ec9c0 Constraints: Axis-locked • Container bounds • Custom limits |
✨ Active Drop StylesVisual feedback during drag operations https://github.com/user-attachments/assets/3b8a3d00-38ad-4532-bd42-173037ea61b9 Feedback: Hover states • Drop zones • Visual cues |
🔄 State ManagementComplete lifecycle tracking and callbacks https://github.com/user-attachments/assets/da5e526f-f2d2-4dc5-96b5-3fecc4faf57a States: Idle • Dragging • Animating • Dropped |
npm install react-native-reanimated-dnd
npm install react-native-reanimated react-native-gesture-handler
Follow the setup guides:
import React from "react";
import { View, Text } from "react-native";
import { GestureHandlerRootView } from "react-native-gesture-handler";
import { Draggable, DropProvider } from "react-native-reanimated-dnd";
export default function App() {
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<DropProvider>
<View style={{ flex: 1, padding: 20 }}>
<Draggable data={{ id: "1", title: "Drag me!" }}>
<View
style={{
padding: 20,
backgroundColor: "#007AFF",
borderRadius: 8,
}}
>
<Text style={{ color: "white" }}>Drag me around!</Text>
</View>
</Draggable>
</View>
</DropProvider>
</GestureHandlerRootView>
);
}
import React from "react";
import { View, Text } from "react-native";
import { GestureHandlerRootView } from "react-native-gesture-handler";
import {
Draggable,
Droppable,
DropProvider,
} from "react-native-reanimated-dnd";
export default function DragDropExample() {
const handleDrop = (data: any) => {
console.log("Item dropped:", data);
};
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<DropProvider>
<View style={{ flex: 1, padding: 20 }}>
{/* Draggable Item */}
<Draggable data={{ id: "1", title: "Drag me!" }}>
<View style={styles.draggableItem}>
<Text>📦 Drag me to a zone</Text>
</View>
</Draggable>
{/* Drop Zones */}
<Droppable onDrop={handleDrop}>
<View style={styles.dropZone}>
<Text>🎯 Drop Zone 1</Text>
</View>
</Droppable>
<Droppable onDrop={handleDrop}>
<View style={styles.dropZone}>
<Text>🎯 Drop Zone 2</Text>
</View>
</Droppable>
</View>
</DropProvider>
</GestureHandlerRootView>
);
}
import React, { useState } from "react";
import { View, Text } from "react-native";
import { GestureHandlerRootView } from "react-native-gesture-handler";
import { Sortable, SortableItem } from "react-native-reanimated-dnd";
interface Task {
id: string;
title: string;
}
export default function SortableExample() {
const [tasks, setTasks] = useState<Task[]>([
{ id: "1", title: "Learn React Native" },
{ id: "2", title: "Build an app" },
{ id: "3", title: "Deploy to store" },
]);
const renderTask = ({ item, id, positions, ...props }) => (
<SortableItem
key={id}
id={id}
positions={positions}
{...props}
onMove={(itemId, from, to) => {
const newTasks = [...tasks];
const [movedTask] = newTasks.splice(from, 1);
newTasks.splice(to, 0, movedTask);
setTasks(newTasks);
}}
>
<View style={styles.taskItem}>
<Text>{item.title}</Text>
{/* Drag Handle */}
<SortableItem.Handle style={styles.dragHandle}>
<Text>⋮⋮</Text>
</SortableItem.Handle>
</View>
</SortableItem>
);
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<Sortable
data={tasks}
renderItem={renderTask}
itemHeight={60}
style={{ flex: 1, padding: 16 }}
/>
</GestureHandlerRootView>
);
}
<Draggable>
Makes any component draggable with extensive customization options.
<Draggable
data={any} // Data associated with the item
onDragStart={(data) => void} // Called when dragging starts
onDragEnd={(data) => void} // Called when dragging ends
onDragging={(position) => void} // Called during dragging
onStateChange={(state) => void} // Called on state changes
dragDisabled={boolean} // Disable dragging
collisionAlgorithm="center|intersect|contain" // Collision detection method
dragAxis="x|y|both" // Constrain movement axis
dragBoundsRef={RefObject} // Boundary container reference
animationFunction={(toValue) => Animation} // Custom animation function
style={StyleProp<ViewStyle>} // Component styling
>
{children}
</Draggable>
<Droppable>
Creates drop zones with visual feedback and capacity management.
<Droppable
onDrop={(data) => void} // Called when item is dropped
onActiveChange={(isActive) => void} // Called on hover state change
dropDisabled={boolean} // Disable drop functionality
dropAlignment="top-left|center|bottom-right|..." // Drop positioning
dropOffset={{ x: number, y: number }} // Position offset
activeStyle={StyleProp<ViewStyle>} // Style when active
capacity={number} // Maximum items allowed
droppableId={string} // Unique identifier
>
{children}
</Droppable>
<Sortable>
High-level component for sortable lists with auto-scrolling.
<Sortable
data={Array<{ id: string }>} // Array of items to render
renderItem={(props) => ReactNode} // Render function for items
itemHeight={number} // Height of each item
itemKeyExtractor={(item) => string} // Custom key extractor
style={StyleProp<ViewStyle>} // List container style
contentContainerStyle={StyleProp<ViewStyle>} // Content container style
/>
<SortableItem>
Individual item within a sortable list with gesture handling.
<SortableItem
id={string} // Unique identifier
data={any} // Item data
positions={SharedValue} // Position tracking
onMove={(id, from, to) => void} // Called when item moves
onDragStart={(id, position) => void} // Called when dragging starts
onDrop={(id, position) => void} // Called when item is dropped
onDragging={(id, overItemId, y) => void} // Called during dragging
style={StyleProp<ViewStyle>} // Item styling
animatedStyle={StyleProp<AnimatedStyle>} // Animated styling
>
{children}
</SortableItem>
useDraggable(options)
Core hook for implementing draggable functionality.
useDroppable(options)
Core hook for implementing droppable functionality.
useSortable(options)
Hook for individual sortable items with position management.
useSortableList(options)
Hook for managing entire sortable lists with auto-scrolling.
<DropProvider>
Required context provider that manages global drag-and-drop state.
<DropProvider>{/* All draggable and droppable components */}</DropProvider>
DraggableState
enum DraggableState {
IDLE = "idle",
DRAGGING = "dragging",
ANIMATING = "animating",
}
CollisionAlgorithm
type CollisionAlgorithm = "center" | "intersect" | "contain";
DropAlignment
type DropAlignment =
| "top-left"
| "top-center"
| "top-right"
| "center-left"
| "center"
| "center-right"
| "bottom-left"
| "bottom-center"
| "bottom-right";
import { withTiming, withSpring, Easing } from "react-native-reanimated";
// Smooth timing animation
const smoothAnimation = (toValue) => {
"worklet";
return withTiming(toValue, {
duration: 300,
easing: Easing.bezier(0.25, 0.1, 0.25, 1),
});
};
// Spring animation
const springAnimation = (toValue) => {
"worklet";
return withSpring(toValue, {
damping: 15,
stiffness: 150,
});
};
<Draggable animationFunction={springAnimation}>{/* content */}</Draggable>;
// Precise center-point collision
<Draggable collisionAlgorithm="center">
{/* Requires center point to be over drop zone */}
</Draggable>
// Forgiving intersection collision (default)
<Draggable collisionAlgorithm="intersect">
{/* Any overlap triggers collision */}
</Draggable>
// Strict containment collision
<Draggable collisionAlgorithm="contain">
{/* Entire draggable must be within drop zone */}
</Draggable>
<SortableItem id={item.id} {...props}>
<View style={styles.itemContainer}>
<Text>{item.title}</Text>
{/* Only this handle area can initiate dragging */}
<SortableItem.Handle style={styles.dragHandle}>
<View style={styles.handleIcon}>
<View style={styles.dot} />
<View style={styles.dot} />
<View style={styles.dot} />
</View>
</SortableItem.Handle>
</View>
</SortableItem>
const containerRef = useRef<View>(null);
<View ref={containerRef} style={styles.container}>
<Draggable
data={data}
dragBoundsRef={containerRef}
dragAxis="x" // Constrain to horizontal movement
>
{/* content */}
</Draggable>
</View>;
<Droppable
capacity={3}
onDrop={(data) => {
if (currentItems.length < 3) {
addItem(data);
}
}}
activeStyle={{
backgroundColor: currentItems.length < 3 ? "#e8f5e8" : "#ffe8e8",
}}
>
<Text>Drop Zone ({currentItems.length}/3)</Text>
</Droppable>
git clone https://github.com/entropyconquers/react-native-reanimated-dnd.git
cd react-native-reanimated-dnd
npm install
cd example-app
npm install
# iOS
npx expo run:ios
# Android
npx expo run:android
The example app includes all 15 interactive examples showcasing every feature of the library.
Contributions are always welcome! Please see our Contributing Guide for details.
MIT © Vishesh Raheja
Made with ❤️ for the React Native community
FAQs
A powerful drag-and-drop library for React Native using Reanimated 3
The npm package react-native-reanimated-dnd receives a total of 7,128 weekly downloads. As such, react-native-reanimated-dnd popularity was classified as popular.
We found that react-native-reanimated-dnd demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover how browser extensions in trusted stores are used to hijack sessions, redirect traffic, and manipulate user behavior.
Research
Security News
An in-depth analysis of credential stealers, crypto drainers, cryptojackers, and clipboard hijackers abusing open source package registries to compromise Web3 development environments.
Security News
pnpm 10.12.1 introduces a global virtual store for faster installs and new options for managing dependencies with version catalogs.