Native file support
Besides custom data passing between components.
Vue dnd also supports native ondrop
events.
NativeFile
type
Import Before we create the drop zone, we need to import the special NativeFile
type.
import { NativeFile } from '@mmis1000/vue-dnd'
This type is a special type that makes the useDroppable
hook to receive any drop events.
Init the hook and handle the events
You just use this type like a regular Type
, and handle the native event.
const image = ref('')
const { propsItem, hoverState } = useDroppable(
NativeFile.withFilter(ev => {
return (ev.dataTransfer?.types.indexOf('Files') ?? -1) >= 0
}),
{
onDrop(ev: DragEvent) {
if (ev.dataTransfer?.files.length ?? 0 > 0) {
const file = ev.dataTransfer!.files.item(0)!
if (!file.type.startsWith('image/')) {
console.log('not a image')
return
}
const url = URL.createObjectURL(file)
if (image.value !== '') {
URL.revokeObjectURL(image.value)
}
image.value = url
console.log('a image dropped')
}
}
}
);
Result
example Source
Drop image here
Note
This type does supports withFilter
that accept a argument of DragEvent
, but you can't get the file content of native drop events before ondrop
happens.
This is a native limit and there is no way to workaround it.