温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2023-05-10 15:57:11 来源:亿速云 阅读:518 作者:iii 栏目:开发技术

这篇文章主要介绍“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问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI