useDropImageOrText.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { computed, onMounted, onUnmounted, Ref } from 'vue'
  2. import { useStore } from '@/store'
  3. import { getImageDataURL } from '@/utils/image'
  4. import useCreateElement from '@/hooks/useCreateElement'
  5. export default (elementRef: Ref<HTMLElement | undefined>) => {
  6. const store = useStore()
  7. const disableHotkeys = computed(() => store.state.disableHotkeys)
  8. const { createImageElement, createTextElement } = useCreateElement()
  9. // 拖拽元素到画布中
  10. const handleDrop = (e: DragEvent) => {
  11. if (!e.dataTransfer) return
  12. const dataTransferItem = e.dataTransfer.items[0]
  13. // 检查事件对象中是否存在图片,存在则插入图片,否则继续检查是否存在文字,存在则插入文字
  14. if (dataTransferItem.kind === 'file' && dataTransferItem.type.indexOf('image') !== -1) {
  15. const imageFile = dataTransferItem.getAsFile()
  16. if (imageFile) {
  17. getImageDataURL(imageFile).then(dataURL => createImageElement(dataURL))
  18. }
  19. }
  20. else if (dataTransferItem.kind === 'string' && dataTransferItem.type === 'text/plain') {
  21. dataTransferItem.getAsString(text => {
  22. if (disableHotkeys.value) return
  23. createTextElement({
  24. left: 0,
  25. top: 0,
  26. width: 600,
  27. height: 50,
  28. }, text)
  29. })
  30. }
  31. }
  32. onMounted(() => {
  33. elementRef.value && elementRef.value.addEventListener('drop', handleDrop)
  34. document.ondragleave = e => e.preventDefault()
  35. document.ondrop = e => e.preventDefault()
  36. document.ondragenter = e => e.preventDefault()
  37. document.ondragover = e => e.preventDefault()
  38. })
  39. onUnmounted(() => {
  40. elementRef.value && elementRef.value.removeEventListener('drop', handleDrop)
  41. document.ondragleave = null
  42. document.ondrop = null
  43. document.ondragenter = null
  44. document.ondragover = null
  45. })
  46. }