packages/docsite/markdown/docs/03 Using Hooks/HooksOverview.md
New to React DnD? Read the overview before jumping into the docs.
Drag-and-drop interactions are inherently stateful. Because of this React DnD has been designed to take advantage of the Flux data pattern and model drag-and-drop state using actions and reducers (independent of React). Hooks are the perfect way to utilize a stateful data source in React. In fact, this is the approach taken by many state-management libraries in React!
There are three primary hooks that are provided to wire your components into React DnD, and a fourth is provided to give you a seam into React DnD (for testing or development purposes)
useDraguseDropuseDragLayeruseDragDropManager (dev/test hook)To start using hooks, let's make a box draggable.
import { useDrag } from 'react-dnd'
function Box() {
const [{ isDragging }, drag, dragPreview] = useDrag(() => ({
// "type" is required. It is used by the "accept" specification of drop targets.
type: 'BOX',
// The collect function utilizes a "monitor" instance (see the Overview for what this is)
// to pull important pieces of state from the DnD system.
collect: (monitor) => ({
isDragging: monitor.isDragging()
})
}))
return (
<div ref={dragPreview} style={{ opacity: isDragging ? 0.5 : 1}}>
<div role="Handle" ref={drag} />
</div>
)
}
Now, let's make something for this to drag into.
function Bucket() {
const [{ canDrop, isOver }, drop] = useDrop(() => ({
// The type (or types) to accept - strings or symbols
accept: 'BOX',
// Props to collect
collect: (monitor) => ({
isOver: monitor.isOver(),
canDrop: monitor.canDrop()
})
}))
return (
<div
ref={drop}
role={'Dustbin'}
style={{ backgroundColor: isOver ? 'red' : 'white' }}
>
{canDrop ? 'Release to drop' : 'Drag a box here'}
</div>
)
}
To explore further, read the individual hook API documentation, or check out the examples on GitHub.