Drag&Drop functionality for React Native. Uses new React Context API.

npm install react-native-useful-dnd
or
yarn add react-native-useful-dnd
import DragProvider from 'react-native-useful-dnd'
- DragProvider - provider of drag&drop functionality. Must be higher in the React-tree than Draggable and DropZone components.
- DragProvider.Draggable - draggable wrapper. Required unique id prop.
- DragProvider.DropZone - drop zone wrapper. Required unique id prop.
| prop |
description |
default |
type |
| children |
Children node |
undefined |
React.Node |
| onDragStart |
Start drag callback |
undefined |
Function |
| onDragMove |
Move Draggable callback |
undefined |
Function |
| onDragEnter |
Enter Draggable to DropZone callback |
undefined |
Function |
| onDragLeave |
Leave Draggable to DropZone callback |
undefined |
Function |
| onDragEnd |
End of drag callback |
undefined |
Function |
| onDrop |
End of drag over DropZone callback |
undefined |
Function |
| prop |
description |
default |
type |
| id |
Unique id of Draggable component |
undefined (required) |
string |
| children |
Draggable component |
undefined |
React.Node/Function |
| prop |
description |
default |
type |
| active |
True when component drag |
false |
boolean |
| allowDrop |
True when Draggable component over DropZone |
false |
boolean |
| prop |
description |
default |
type |
| id |
Unique id of DropZone component |
undefined (required) |
string |
| children |
DropZone component |
undefined |
React.Node/Function |
| prop |
description |
default |
type |
| dropOver |
True when DropZone component under Draggable |
false |
boolean |
import React from 'react'
import { Text, View, StyleSheet, } from 'react-native'
import DragProvider from 'react-native-useful-dnd'
const dragItemStyles = StyleSheet.create({
view: {
width: 50,
height: 50,
borderRadius: 25,
backgroundColor: '#FFD517',
alignItems: 'center',
justifyContent: 'center',
},
drag: {
borderWidth: 1,
borderColor: 'red',
},
dragOver: {
borderWidth: 5,
borderColor: 'olive',
},
})
const DragItem = ({ style, color, drag, dragOver, ...props }) => (
<View {...props} style={[ dragItemStyles.view, { backgroundColor: color, }, drag && dragItemStyles.drag, dragOver && dragItemStyles.dragOver, style ]}>
<Text>DRAG_ME</ Text>
</View>
)
export default class AboutUs extends React.Component {
handleDrop = (DropZoneId, draggableId) => console.log('onDrop', DropZoneId, draggableId)
handleDragStart = (draggableId) => console.log('handleDragStart', draggableId)
handleDragMove = (draggableId) => console.log('handleDragMove', draggableId)
handleDragEnter = (draggableId, DropZoneId) => console.log('handleDragEnter', draggableId, DropZoneId)
handleDragLeave = (draggableId, DropZoneId) => console.log('handleDragLeave', draggableId, DropZoneId)
handleDrop = (draggableId, DropZoneId) => console.log('handleDrop', draggableId, DropZoneId)
handleDragEnd = (draggableId) => console.log('handleDragEnd', draggableId)
render() {
return (
<DragProvider
onDragStart={this.handleDragStart}
onDragMove={this.handleDragMove}
onDragEnter={this.handleDragEnter}
onDragLeave={this.handleDragLeave}
onDrop={this.handleDrop}
onDragEnd={this.handleDragEnd}
>
<View style={{ height: 150, backgroundColor: '#eaeaea', }}>
<DragProvider.Draggable
id="purple"
>
{({ dragOver, drag, }) => (
<DragItem color="purple" drag={drag} dragOver={dragOver} />
)}
</DragProvider.Draggable>
<DragProvider.Draggable id="orange">
<DragItem color="orange" />
</DragProvider.Draggable>
</View>
<DragProvider.DropZone id="myDropZone">
{({ dropOver, }) => (
<View
style={[
{ height: 100, justifyContent: 'center', alignItems: 'center', backgroundColor: 'yellow', },
dropOver && { backgroundColor: 'orange', }
]}
>
<Text>Dropzone</Text>
</View>
)}
</DragProvider.DropZone>
</DragProvider>
)
}
}
MIT
- 0.1.2 - fix call onDragMove after onDragEnd.
- 0.1.1 - fix bug, add demo gif, add peerDependencies.
- 0.1.0 - package created.