element自定义多文件上传触发多次on-change问题怎么解决

开发技术 作者:iii 2024-05-09 18:55:01
这篇文章主要介绍“element自定义多文件上传触发多次on-change问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,�...

这篇文章主要介绍“element自定义多文件上传触发多次on-change问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“element自定义多文件上传触发多次on-change问题怎么解决”文章能帮助大家解决问题。

    element自定义 多文件上传 触发多次on-change

    由于项目需要,图片上传需要进行压缩之后在调用接口,那就只能走自定义上传

    自定义上传关键在于:

    • action  = #

    • :auto-upload="false"

    <el-upload
        ref="upload"
        action="#"  // 上传入口改成 #
        :multiple="true" // 多文件上传开启
        :on-change="handleChange" // 改变监听
        :file-list="fileList"  //文件列表
        :auto-upload="false" // 自动上传关闭
    >
        <i class="el-icon-plus"></i>
    </el-upload>

    由于 auto-upload 设置为 false 之后,before-upload 会失效,所以上传的事件之前体现在 change 里。

    但是这样呢在上传文件时无论是多图还是单图,在上传后都会走2次 handleChange ,

    此时我们需要一个防抖方法,来限制它。

    handleChange(file, fileList) {
      /*
          自动上传改成true会导致重复触发,所以在handleChange上传文件
        */
      //  防抖
      let length = fileList.length
      this.maxLength = Math.max(length, this.maxLength)
      setTimeout(() => {
        if (length === this.maxLength) {
          // 你的上传文件逻辑
        }
      }, 100)
    }

    this.maxLength 默认设置 0 就行,要记得在上传成功(完成)后需要设置为默认 0。

    下面附上我完整的代码

    change 事件

    handleChange(file, fileList) {
      /*
          自动上传改成true会导致重复触发,所以在handleChange上传文件
        */
      //  防抖
      let length = fileList.length
      this.maxLength = Math.max(length, this.maxLength)
      setTimeout(() => {
        if (length === this.maxLength) {
            // 图片验证
          this.uploadFilesVerification(fileList)
        }
      }, 100)
    }

    图片验证: uploadFilesVerification

    // 图片验证
    async uploadFilesVerification(fileList) {
      let resFileList = []
      for (const key in fileList) {
        console.log('fileList[key] :>> ', fileList[key])
        // 判断文件大小(5M)
        if (fileList[key].size > 1024 * 1024 * 5) {
          this.$message.warning('图片大小不可以超过5M')
          return
        }
        // 图片压缩(这里用的 lrz,项目不需要可以忽略)
        const lrzData = await lrz(fileList[key].raw, { quality: 0.5 })
        // 内容验证
        //  xxxx
     
        resFileList.push(lrzData.origin)
      }
     
      // 上传图片
      this.customUploadFn(resFileList)
     
    }

    自定义上传:customUploadFn

    // 自定义上传
    async function customUploadFn(fileList) {
      let form = new FormData()
      fileList.forEach((item) => {
        form.append('files', item)
      })
      const { data } = await uploadFiles(form) // 上传 api 接口
      console.log('data :>> ', data)
      data.forEach((item) => {
        this.goodsImgList.push(item) // 图片回显数组
      })
      this.fileList = [] // 清空图片已经上传的图片列表(绑定在上传组件的file-list)
      this.maxLength = 0 // 恢复默认值
    }

    el-upload自定义上传触发多次change事件解决

    昨天在做项目时,有个附件上传的需求,需要使用formdata上传文件,并且支持多文件上传,使用el-upload on-change时发现会调用多次,以下是我整理出来规避的方法。

    vue部分:

    <el-upload
     :on-change="handleUpload"
     :on-remove="handleRemove"
     :auto-upload="false"
     :show-file-list="false"
     drag
     action="#"
     ref="upload"
     multiple
     
     >
      <div class="el-upload__text">拖拽文件或点击上传</div>
    </el-upload>

    ts/js部分:

      // 附件上传
      private handleUpload(file, fileList) {
        let length = fileList.length;
        this.maxFileLength = Math.max(length, this.maxFileLength)
        setTimeout(() => {
          if (this.maxFileLength !== length) {
            return
          }
          fileList.forEach(item => {
            this.fileList.push(item.raw)
          })
        }, 0)
      }

    定义一个全局变量maxFileLength 用于计算当前上传次数,如果上传次数等于上传文件的数量长度则将文件放到当前下发文件的参数中。

    关于“element自定义多文件上传触发多次on-change问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注捷杰建站行业资讯频道,小编每天都会为大家更新不同的知识点。

    原创声明
    本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    本文链接:http://www.jiecseo.com/news/show_25748.html
    element on-change