apps/docs/vue/composables/use-draggable.mdx
import {CodeSandbox} from '/snippets/sandbox.mdx'; import {draggableStyles} from '/snippets/code.mdx';
<CodeSandbox template="vue" files={{ 'src/App.vue': {code: app, hidden: true}, 'src/Draggable.vue': {code: code, active: true}, 'src/styles.css': {code: draggableStyles, hidden: true}, }} height={260} previewHeight={200} hero />
The useDraggable composable requires a unique id and an element template ref. It returns reactive computed properties for the drag state.
<script setup>
import {ref} from 'vue';
import {useDraggable} from '@dnd-kit/vue';
const element = ref(null);
const {isDragging} = useDraggable({id: 'my-draggable', element});
</script>
<template>
<button ref="element" :data-dragging="isDragging">
Drag me
</button>
</template>
All input properties accept plain values or Vue refs/getters (MaybeRefOrGetter), so they can be reactive.
You can render a completely different element while the draggable element is being dragged by using the <DragOverlay> component.
<script setup>
import {ref} from 'vue';
import {DragDropProvider, DragOverlay, useDraggable} from '@dnd-kit/vue';
const element = ref(null);
useDraggable({id: 'draggable', element});
</script>
<template>
<DragDropProvider>
<button ref="element">Draggable</button>
<DragOverlay>
<div>I will be rendered while dragging...</div>
</DragOverlay>
</DragDropProvider>
</template>
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, use the scoped slot to access the drag source:
<script setup>
import {DragDropProvider, DragOverlay} from '@dnd-kit/vue';
</script>
<template>
<DragDropProvider>
<Draggable id="foo" />
<Draggable id="bar" />
<DragOverlay>
<template #default="{ source }">
<div>Dragging {{ source.id }}</div>
</template>
</DragOverlay>
</DragDropProvider>
</template>
export const app = `
<script setup> import { DragDropProvider } from '@dnd-kit/vue'; import Draggable from './Draggable.vue'; import './styles.css'; </script> <template> <DragDropProvider> <Draggable id="draggable" /> </DragDropProvider> </template> `.trim();export const code = `
<script setup> import { ref } from 'vue'; import { useDraggable } from '@dnd-kit/vue'; const element = ref(null); useDraggable({ id: 'draggable', element }); </script> <template> <button ref="element" class="btn">draggable</button> </template> `.trim();