Skip to main content

Quick Start

Get up and running with React Native Reanimated DnD in minutes.

Basic Setup​

1. Wrap your app with DropProvider​

The DropProvider is the foundation that enables communication between draggable and droppable components. It must wrap all drag-and-drop functionality in your app.

import React from 'react';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { DropProvider } from 'react-native-reanimated-dnd';

function App() {
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<DropProvider>
{/* Your app content */}
</DropProvider>
</GestureHandlerRootView>
);
}

2. Create your first draggable​

import { Draggable } from 'react-native-reanimated-dnd';

function MyDraggable() {
return (
<Draggable data={{ id: '1', name: 'First Item' }}>
<View style={styles.draggableItem}>
<Text>Drag me!</Text>
</View>
</Draggable>
);
}

3. Add a drop zone​

import { Droppable } from 'react-native-reanimated-dnd';

function MyDropZone() {
return (
<Droppable onDrop={(data) => console.log('Dropped:', data)}>
<View style={styles.dropZone}>
<Text>Drop items here</Text>
</View>
</Droppable>
);
}

Complete Example​

Here's a complete working example that demonstrates basic drag-and-drop functionality:

import React, { useState } from 'react';
import { View, Text, StyleSheet, Alert } from 'react-native';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { DropProvider, Draggable, Droppable } from 'react-native-reanimated-dnd';

interface Item {
id: string;
title: string;
color: string;
}

export default function QuickStartExample() {
const [items] = useState<Item[]>([
{ id: '1', title: 'Item 1', color: '#FF6B6B' },
{ id: '2', title: 'Item 2', color: '#4ECDC4' },
{ id: '3', title: 'Item 3', color: '#45B7D1' },
]);

const handleDrop = (data: Item) => {
Alert.alert('Success!', `${data.title} was dropped!`);
};

return (
<GestureHandlerRootView style={styles.container}>
<DropProvider>
<View style={styles.content}>
<Text style={styles.title}>Quick Start Example</Text>

{/* Draggable Items */}
<View style={styles.itemsContainer}>
{items.map((item) => (
<Draggable key={item.id} data={item}>
<View style={[styles.draggableItem, { backgroundColor: item.color }]}>
<Text style={styles.itemText}>{item.title}</Text>
</View>
</Draggable>
))}
</View>

{/* Drop Zone */}
<Droppable onDrop={handleDrop}>
<View style={styles.dropZone}>
<Text style={styles.dropZoneText}>Drop items here</Text>
</View>
</Droppable>
</View>
</DropProvider>
</GestureHandlerRootView>
);
}

const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#f5f5f5',
},
content: {
flex: 1,
padding: 20,
},
title: {
fontSize: 24,
fontWeight: 'bold',
textAlign: 'center',
marginBottom: 30,
color: '#333',
},
itemsContainer: {
flexDirection: 'row',
justifyContent: 'space-around',
marginBottom: 50,
},
draggableItem: {
width: 80,
height: 80,
borderRadius: 40,
justifyContent: 'center',
alignItems: 'center',
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.25,
shadowRadius: 4,
elevation: 5,
},
itemText: {
color: 'white',
fontWeight: 'bold',
fontSize: 12,
textAlign: 'center',
},
dropZone: {
height: 150,
backgroundColor: '#e0e0e0',
borderWidth: 2,
borderColor: '#999',
borderStyle: 'dashed',
borderRadius: 10,
justifyContent: 'center',
alignItems: 'center',
},
dropZoneText: {
fontSize: 18,
color: '#666',
fontWeight: '500',
},
});

Key Points​

  • DropProvider: Must wrap all draggable and droppable components
  • GestureHandlerRootView: Required for gesture handling to work properly
  • data prop: Pass data that will be available in drop handlers
  • onDrop callback: Handle successful drop events

Next Steps​

Sortable Lists​

For reorderable lists, use the Sortable and SortableItem components:

import { Sortable, SortableItem } from 'react-native-reanimated-dnd';

function SortableExample() {
const [items, setItems] = useState([
{ id: '1', title: 'First Item' },
{ id: '2', title: 'Second Item' },
{ id: '3', title: 'Third Item' },
]);

const renderItem = ({ item, ...props }) => (
<SortableItem {...props}>
<View style={styles.sortableItem}>
<Text>{item.title}</Text>
<Text style={styles.dragIndicator}>⋮⋮</Text>
</View>
</SortableItem>
);

return (
<Sortable
data={items}
renderItem={renderItem}
itemHeight={60}
style={styles.sortableList}
/>
);
}

Key Features Demonstrated​

Data Flow​

  • Draggable components carry data through the data prop
  • Droppable components receive this data via the onDrop callback
  • Data can be any JavaScript object (strings, numbers, objects, arrays)

Visual Feedback​

  • Items automatically animate when dragged
  • Drop zones can show visual feedback when items hover over them
  • Smooth return animations when items are dropped outside valid zones

State Management​

  • Use React state to track dropped items
  • Update your application state in drop handlers
  • Integrate with your existing state management solution

Advanced Features Preview​

The library includes many advanced features you can explore:

  • Drag Handles: Specific areas that initiate dragging
  • Collision Detection: Multiple algorithms (center, intersect, contain)
  • Bounded Dragging: Constrain movement within specific areas
  • Axis Constraints: Limit movement to horizontal or vertical
  • Custom Animations: Define your own animation functions
  • Auto-scrolling: Automatic scrolling in sortable lists

What's Next?​