apps/docs/solid/hooks/use-draggable.mdx
import {CodeSandbox} from '/snippets/sandbox.mdx'; import {draggableStyles} from '/snippets/code.mdx';
<CodeSandbox template="solid" files={{ 'App.tsx': {code: app, active: true}, 'styles.css': {code: draggableStyles, hidden: true}, }} height={220} previewHeight={200} hero />
The useDraggable hook requires a unique id and returns a ref callback and reactive getters for drag state.
import {useDraggable} from '@dnd-kit/solid';
function Draggable() {
const {ref, isDragging} = useDraggable({id: 'my-draggable'});
return (
<button ref={ref} data-dragging={isDragging()}>
Drag me
</button>
);
}
You can render a completely different element while the draggable element is being dragged by using the <DragOverlay> component.
import {DragDropProvider, DragOverlay, useDraggable} from '@dnd-kit/solid';
function Draggable() {
const {ref} = useDraggable({id: 'draggable'});
return (
<>
<button ref={ref}>Draggable</button>
<DragOverlay>
<div>I will be rendered while dragging...</div>
</DragOverlay>
</>
);
}
The <DragOverlay> component will only render its children when a drag operation is in progress. This can be useful for rendering a completely different element while the draggable element is being dragged.
To render different content depending on which element is being dragged, pass a function as a child that receives the drag source:
import {DragDropProvider, DragOverlay} from '@dnd-kit/solid';
function App() {
return (
<DragDropProvider>
<Draggable id="foo" />
<Draggable id="bar" />
<DragOverlay>
{source => (
<div>Dragging {source.id}</div>
)}
</DragOverlay>
</DragDropProvider>
);
}
export const app = ` import {DragDropProvider, useDraggable} from '@dnd-kit/solid'; import './styles.css';
function Draggable() { const {ref} = useDraggable({id: 'draggable'});
return <button ref={ref} class="btn">draggable</button>; }
export default function App() { return ( <DragDropProvider> <Draggable /> </DragDropProvider> ); } `.trim();