vue实现上传拖拽功能

vue实现上传拖拽功能

首先让我们看看用到了那些属性

  1. accept

一个 HTML 属性,用于指定可接受的文件类型或 MIME 类型,通常用于文件上传的 元素,用于限制用户在文件选择对话框中可以选择的文件类型或 MIME 类型。这有助于提供更好的用户体验,并在前端对文件类型进行初步筛选

  1. change

change 事件在表单元素的值发生改变时被触发,可以用于处理用户对表单元素的交互操作,通常与表单元素(如 , , 等)一起使用。需要注意的是,change 事件通常在表单元素失去焦点(blur)时触发,而不是实时地监测值的变化。

  1. dragover

JS原生事件,用于处理拖放操作中的"悬停"(hover)事件。当拖动元素在目标元素上方悬停时,dragover 事件将被触发。具体来说,当一个元素被拖动时,可以将其拖动到其他元素上方,这时候会触发目标元素的 dragover 事件。通过在 dragover 事件的处理程序中编写代码,可以控制拖放操作时的行为。dragover 事件的默认行为是不允许在目标元素上方放置拖动的元素。这意味着如果不阻止默认行为,拖动的元素将无法在目标元素上方放置。因此,在处理 dragover 事件时,通常需要使用 event.preventDefault() 方法阻止默认行为。在Vue里面我们可以用事件修饰符.prevent

  1. drop

同样也是JS原生事件,用于处理拖放操作中的"放置"(drop)事件。当拖动的元素在目标元素上方释放时,drop 事件将被触发。drop 事件在拖动的元素释放并放置到目标元素上方时被触发。通过在 drop 事件的处理程序中编写代码,可以处理放置操作,即在目标元素上方放置拖动的元素之后的行为,和dragover一起使用drop 事件的默认行为和dragover一样也不允许在目标元素上方放置拖动的元素。这意味着如果不阻止默认行为,拖动的元素将无法在目标元素上方放置。因此,在处理 drop 事件时,通常需要使用 event.preventDefault() 方法阻止默认行为。在Vue里面我们也可以用事件修饰符.prevent

拖拽上传的实现 这里只写了拖拽上传和选择上传的事件处理函数 代码如下


    
      //拖拽上传
      
// input 表单
下载导入模板 将文件拖到此处或 点击上传
// update:props属性名,值 直接修改 .sync修饰符的属性值 取消
export default { // 拖拽上传 async hDrop(e) { const fd = new FormData() fd.append('file', e.dataTransfer.files[0]) await addExcel(fd) this.$emit('update:showExcelDialog', false) this.$emit('updateEmployees') this.$message.success('上传成功') }, // 选择上传 async doAdd(e) { const fd = new FormData() fd.append('file', e.target.files[0]) await addExcel(fd) this.$emit('update:showExcelDialog', false) this.$emit('updateEmployees') this.$message.success('上传成功') } }

这里方便阅读性拆分为两个事件 分别是拖拽上传和点击上传

存在的坑

在获取事件对象属性files的时候, change和drop事件,返回的是不一样的 在change事件返回的事件对象里拿到flies要通过event.target.Files[0]来拿到 而drop则完全不一样要通过 event.dataTransfer.files[0]来拿到Files.

drop返回的Files数据
vue实现上传拖拽功能_第1张图片

change返回的Files数据
vue实现上传拖拽功能_第2张图片

为什么会这样
后来查询资料,是因为在拖放操作中,drop 事件提供了 event.dataTransfer 属性,该属性包含有关拖放操作的数据传输信息。其中,event.dataTransfer.files 是一个文件列表(FileList),表示拖放的文件。通过索引访问 event.dataTransfer.files,可以获取到拖放的文件对象。因此,在 drop 事件处理程序中,使用 event.dataTransfer.files[0] 可以获取拖放的第一个文件对象。

而在文件上传的场景中,change 事件触发时,event.target 指向了文件上传的 元素本身。通过访问 event.target.files 属性,可以获取用户选择的文件列表(FileList),而通过索引访问 event.target.files 可以获取到所选的文件对象。因此,在文件上传的 change 事件处理程序中,使用 event.target.files[0] 可以获取用户选择的第一个文件对象。

这种差异是由于拖放操作和文件上传操作的不同特性所导致的。拖放操作可能涉及多个文件的拖动和放置,因此提供了 event.dataTransfer.files 以获取整个文件列表。而文件上传操作通常是通过文件选择对话框选择单个或多个文件,因此提供了 event.target.files 来获取所选的文件列表。

你可能感兴趣的:(vue.js,前端,javascript)