Skip to main content

DraxView

The core building block of Drax. Any DraxView can be dragged, receive drops, and/or monitor drags. Extends React Native's ViewProps.

Import

import { DraxView } from 'react-native-drax';

Usage

<DraxView
payload={{ id: 'task-1' }}
onDragStart={() => console.log('dragging')}
onReceiveDragDrop={({ dragged }) => handleDrop(dragged.payload)}
hoverStyle={{ opacity: 0.8 }}
/>

Core Props

PropTypeDefaultDescription
idstringauto-generatedUnique Drax view identifier
draggablebooleantrueWhether the view can be dragged
receptivebooleantrueWhether the view can receive drags
monitoringbooleanfalseWhether the view monitors drags inside it
isParentbooleanfalseTreat as parent for nested DraxViews
payloadunknownData for both dragPayload and receiverPayload
dragPayloadunknownData delivered to receivers when dragged
receiverPayloadunknownData delivered to dragged views when receiving
longPressDelaynumber250ms before drag activates
noHoverbooleanfalseDon't render hover copy
dragHandlebooleanfalseOnly DraxHandle descendants start drag
collisionAlgorithmCollisionAlgorithm'center''center' | 'intersect' | 'contain'
dragBoundsRefRefObject<any>Constrains drag within a view
lockDragXPositionbooleanfalseLock horizontal drag movement
lockDragYPositionbooleanfalseLock vertical drag movement
dragActivationFailOffsetnumberCancel drag if finger moves more than this (px) during long press
capacitynumberMax items this view can receive (auto-rejects when full)
rejectOwnChildrenbooleanfalseDon't receive drags from own children

Drag Callbacks

CallbackTypeDescription
onDragStart(data: DraxDragEventData) => voidDrag begins
onDrag(data: DraxDragEventData) => voidEvery frame, no receiver
onDragEnter(data: DraxDragWithReceiverEventData) => voidEntered new receiver
onDragOver(data: DraxDragWithReceiverEventData) => voidEvery frame, over receiver
onDragExit(data: DraxDragWithReceiverEventData) => voidLeft a receiver
onDragEnd(data: DraxDragEndEventData) => DraxProtocolDragEndResponseDrag ended (no receiver / cancelled)
onDragDrop(data: DraxDragWithReceiverEventData) => DraxProtocolDragEndResponseDropped on receiver
onSnapEnd(data: DraxSnapEndEventData) => voidSnap-back animation completed

Receiver Callbacks

CallbackTypeDescription
onReceiveDragEnter(data: DraxDragWithReceiverEventData) => voidSomething dragged over
onReceiveDragOver(data: DraxDragWithReceiverEventData) => voidEvery frame while hovering
onReceiveDragExit(data: DraxDragWithReceiverEndEventData) => voidDragged item left
onReceiveDragDrop(data: DraxDragWithReceiverEventData) => DraxProtocolDragEndResponseItem dropped on this view
onReceiveSnapEnd(data: DraxSnapEndEventData) => voidSnap animation completed

Monitor Callbacks

CallbackTypeDescription
onMonitorDragStart(data: DraxMonitorEventData) => voidDrag started inside
onMonitorDragEnter(data: DraxMonitorEventData) => voidDragged into area
onMonitorDragOver(data: DraxMonitorEventData) => voidEvery frame inside area
onMonitorDragExit(data: DraxMonitorEventData) => voidLeft monitored area
onMonitorDragEnd(data: DraxMonitorEndEventData) => DraxProtocolDragEndResponseDrag ended inside
onMonitorDragDrop(data: DraxMonitorDragDropEventData) => DraxProtocolDragEndResponseDrop inside area

Acceptance Props

PropTypeDescription
acceptsDrag(draggedPayload: unknown) => booleanSimple payload-based acceptance
dynamicReceptiveCallback(data: { targetId, targetMeasurements, draggedId, draggedPayload }) => booleanAdvanced acceptance with full context

Style Props

View Styles (original view)

PropTypeDescription
styleDraxStylePropDefault style
dragInactiveStyleDraxStylePropWhen not being dragged
draggingStyleDraxStylePropWhile being dragged
draggingWithReceiverStyleDraxStylePropDragging over a receiver
draggingWithoutReceiverStyleDraxStylePropDragging, no receiver
dragReleasedStyleDraxStylePropAfter release, during snap
receiverInactiveStyleDraxStylePropReceiver, nothing hovering
receivingStyleDraxStylePropSomething hovering over
otherDraggingStyleDraxStylePropAnother view is being dragged
otherDraggingWithReceiverStyleDraxStylePropAnother view over a receiver
otherDraggingWithoutReceiverStyleDraxStylePropAnother view, no receiver

Hover Styles (floating copy)

PropTypeDescription
hoverStyleAnimatedViewStylePropWithoutLayoutAlways on hover view
hoverDraggingStyleAnimatedViewStylePropWithoutLayoutWhile actively dragging
hoverDraggingWithReceiverStyleAnimatedViewStylePropWithoutLayoutOver a receiver
hoverDraggingWithoutReceiverStyleAnimatedViewStylePropWithoutLayoutNo receiver
hoverDragReleasedStyleAnimatedViewStylePropWithoutLayoutAfter release

Snap Props

PropTypeDefaultDescription
animateSnapbooleantrueAnimate snap after release
snapDelaynumberDelay before snap starts (ms)
snapDurationnumberSnap animation duration (ms)
snapAnimator(data: DraxSnapData) => voidCustom snap animation

Render Props

PropTypeDescription
renderContent(props: DraxRenderContentProps) => ReactNodeCustom render for view content
renderHoverContent(props: DraxRenderHoverContentProps) => ReactNodeCustom render for hover copy

Other Props

PropTypeDescription
registration(reg: DraxViewRegistration | undefined) => voidExternal registration callback
onMeasure(measurements: DraxViewMeasurements | undefined) => voidMeasurement callback
parentDraxParentViewParent view (set automatically by isParent)
scrollPositionSharedValue<Position>Scroll position (internal use)

All standard ViewProps (except style) are also supported.