apps/docs/vue/composables/use-droppable.mdx
import {CodeSandbox} from '/snippets/sandbox.mdx'; import {draggableStyles, droppableStyles} from '/snippets/code.mdx';
<CodeSandbox template="vue" files={{ 'src/App.vue': {code: app, hidden: true}, 'src/Draggable.vue': {code: draggableCode, hidden: true}, 'src/Droppable.vue': {code, active: true}, 'src/styles.css': {code: draggableStyles + '\n\n' + droppableStyles + '\n\n' + containerStyles, hidden: true}, }} height={300} previewHeight={400} hero />
The useDroppable composable requires a unique id and an element template ref.
<script setup>
import {ref} from 'vue';
import {useDroppable} from '@dnd-kit/vue';
const element = ref(null);
const {isDropTarget} = useDroppable({id: 'my-droppable', element});
</script>
<template>
<div ref="element" :data-highlight="isDropTarget">
Drop here
</div>
</template>
export const app = `
<script setup> import { ref } from 'vue'; import { DragDropProvider } from '@dnd-kit/vue'; import Draggable from './Draggable.vue'; import Droppable from './Droppable.vue'; import './styles.css'; const parent = ref(undefined); function onDragEnd(event) { if (event.canceled) return; parent.value = event.operation.target?.id; } </script> <template> <DragDropProvider @dragEnd="onDragEnd"> <div class="container"> <Draggable v-if="parent == null" /> <Droppable> <Draggable v-if="parent === 'droppable'" /> </Droppable> </div> </DragDropProvider> </template> `.trim();export const draggableCode = `
<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();export const code = `
<script setup> import { ref } from 'vue'; import { useDroppable } from '@dnd-kit/vue'; const element = ref(null); const { isDropTarget } = useDroppable({ id: 'droppable', element }); </script> <template> <div ref="element" :class="['droppable', { active: isDropTarget }]"> <slot /> </div> </template> `.trim();export const containerStyles = .container { display: grid; grid-template-columns: 2fr 1fr; grid-gap: 20px; align-items: center; max-width: 700px; margin: 0 auto; }.trim();