upload-dragger.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <template>
  2. <div
  3. class="el-upload-dragger"
  4. :class="{
  5. 'is-dragover': dragover
  6. }"
  7. @drop.prevent="onDrop"
  8. @dragover.prevent="onDragover"
  9. @dragleave.prevent="dragover = false"
  10. >
  11. <slot></slot>
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. name: 'ElUploadDrag',
  17. props: {
  18. disabled: Boolean
  19. },
  20. inject: {
  21. uploader: {
  22. default: ''
  23. }
  24. },
  25. data() {
  26. return {
  27. dragover: false
  28. };
  29. },
  30. methods: {
  31. onDragover() {
  32. if (!this.disabled) {
  33. this.dragover = true;
  34. }
  35. },
  36. onDrop(e) {
  37. if (this.disabled || !this.uploader) return;
  38. const accept = this.uploader.accept;
  39. this.dragover = false;
  40. if (!accept) {
  41. this.$emit('file', e.dataTransfer.files);
  42. return;
  43. }
  44. this.$emit('file', [].slice.call(e.dataTransfer.files).filter(file => {
  45. const { type, name } = file;
  46. const extension = name.indexOf('.') > -1
  47. ? `.${ name.split('.').pop() }`
  48. : '';
  49. const baseType = type.replace(/\/.*$/, '');
  50. return accept.split(',')
  51. .map(type => type.trim())
  52. .filter(type => type)
  53. .some(acceptedType => {
  54. if (/\..+$/.test(acceptedType)) {
  55. return extension === acceptedType;
  56. }
  57. if (/\/\*$/.test(acceptedType)) {
  58. return baseType === acceptedType.replace(/\/\*$/, '');
  59. }
  60. if (/^[^\/]+\/[^\/]+$/.test(acceptedType)) {
  61. return type === acceptedType;
  62. }
  63. return false;
  64. });
  65. }));
  66. }
  67. }
  68. };
  69. </script>