Upload上传图片,回显图片,编辑图片,限制图片,不显示上传图标,图片放大功能

效果图:

新增、编辑时:限制上传四张,当超过四张隐藏上传图标

图片放大 :效果图

详情:回显时不显示上传图标

页面:template 部分

图片在前端存储,提交时一并给后端

:file-list="repairPlanfiles",repairPlanfiles用来存储图片

                <el-upload
                  :class="'uploadStay' + index"
                  :disabled="disabled"
                  :file-list="repairPlanfiles[index]"
                  style="margin-top: 6px"
                  accept=".jpg, .png, .jpeg, .gif"
                  action="#"
                  :multiple="false"
                  ref="uploadImg"
                  :auto-upload="false"
                  list-type="picture-card"
                  :on-change="
                    (file, fileList) => {
                      handleFileChange(file, fileList, index);
                    }
                  "
                  :on-remove="
                    (file, fileList) => {
                      handleRemove(file, fileList, index);
                    }
                  "
                  limit="4"
                  :on-preview="handlePictureCardPreview"
                >
                  <span slot="default" class="el-icon-plus"></span>
                </el-upload>

要求:限制图片格式、显示图片大小、当图片超过四张隐藏上传图标

实现逻辑:新增时用imgs字段来存储新增的图片;编辑时用imgVos字段来接收新增的图片、imgs中存贮后端返回(上次存储)的图片;若为编辑状态给后端提交时:将所有的新增图片放到imgs中,之前(后端返回的图片地址)放到imgVos中

auto-upload设置为"false",则 before-upload 会失效;只能通过on-change 事件

此处handleFileChange事件用来处理上传,当不符合条件时需手动删除,调用handleRemove事件

通过 fileList 来判断图片的数量,控制上传组件

新增、编辑代码:

    handleFileChange(file, fileList, index) {
      const isLt5M = file.size / 1024 / 1024 < 5;
      const isJPG =
        file.raw.type === "image/jpeg" ||
        file.raw.type === "image/jpg" ||
        file.raw.type === "image/png" ||
        file.raw.type === "image/gif";
      if (this.typesOf == "add") {
        if (!isJPG) {
          this.$message({
            message: "上传失败!上传图片文件只支持JPG、PNG、JPEG、GIF",
            type: "warning",
          });
          this.$refs.uploadImg[index].handleRemove(file);
          return false;
        }
        if (!isLt5M) {
          this.$message({
            message: "上传图片大小不能超过5M!",
            type: "warning",
          });
          this.$refs.uploadImg[index].handleRemove(file);
          return false;
        }
        this.form.schemes[index].imgs.push(file.raw);
        this.repairPlanfiles[index].push(file);

      } else {
        if (!isJPG) {
          this.$message({
            message: "上传失败!上传图片文件只支持JPG、PNG、JPEG、GIF",
            type: "warning",
          });
          this.$refs.uploadImg[index].handleRemove(file);
          return false;
        }
        if (!isLt5M) {
          this.$message({
            message: "上传图片大小不能超过5M!",
            type: "warning",
          });
          this.$refs.uploadImg[index].handleRemove(file);
          return false;
        }
        this.form.schemes[index].imgVos.push(file.raw);
        this.repairPlanfiles[index].push(file);

      }
      if (fileList.length == 4) {
        let className = `uploadStay${this.index}`;
        this.$nextTick(() => {
          let ele = document
            .querySelector(`.${className}`)
            .querySelector(".el-upload--picture-card");
          ele.style.display = "none";
        });
      }
    },

删除:我这里处理的比较复杂

默认清空当前的所有图片,然后根据图片的的格式将其存储到 imgs与imgVos中

当当前数组中图片的长度小于4时,显示上传组件

    handleRemove(file, fileList, index) {
      this.form.schemes[index].imgs = [];
      this.form.schemes[index].imgVos = [];
      this.repairPlanfiles[index] = [];
      fileList.forEach((item) => {
        if (item.raw) {
          this.form.schemes[index].imgs.push(item.raw);
          this.repairPlanfiles[index].push(item);
        } else {
          if (item.url) {
            let aa = item.url.toString().split("aiops/");
            this.form.schemes[index].imgVos.push(aa[1]);
            this.repairPlanfiles[index].push(item);
          } else {
            this.form.schemes[index].imgVos.push(item);
            this.repairPlanfiles[index].push(item);
          }
        }
      });
      if (fileList.length < 4) {
        let className = `uploadStay${index}`;
        this.$nextTick(() => {
          let ele = document
            .querySelector(`.${className}`)
            .querySelector(".el-upload--picture-card");
          ele.style.display = "";
        });
      }
    },

详情、编辑:图片回显

回显逻辑:将图片放入repairPlanfiles中

    viewShowImg() {
      //将图片赋值给files对象 处理图片回显
      let schemes = this.formCopy.schemeVoList;
      for (let i in schemes) {
        this.repairPlanfiles.push([]);
        if (schemes[i].imgs) {
          for (let j in schemes[i].imgs) {
            let obj = {};
            obj.url = this.PIC_URL + schemes[i].imgs[j].imgPath;
            this.repairPlanfiles[i].push(obj);
          }
         //处理上传组件
          if (schemes[i].imgs.length == 4) {
            let className = `uploadStay${i}`;
            console.log("className", className);
            this.$nextTick(() => {
              let ele = document
                .querySelector(`.${className}`)
                .querySelector(".el-upload--picture-card");
              ele.style.display = "none";
            });
          }
        }
      }


      this.form.schemes = schemesCopy;
 
    },

图片放大功能

    <!-- 放大图片吗 -->
    <div @click.stop="handleClickItem">
      <el-image-viewer
        v-if="showViewer"
        :on-close="closeImage"
        :url-list="imgList"
        :z-index="5000"
      />
    </div>

逻辑methods

//放大
    handlePictureCardPreview(file) {
      this.imgList.push(file.url);
      this.showViewer = true;
    },
    handleClickItem(e) {
      if (e.target.getAttribute("class") === "el-image-viewer__mask") {
        this.imgList = [];
        this.showViewer = false;
      }
    },
//关闭
    closeImage() {
      this.imgList = [];
      this.showViewer = false;
    },

因小编项目图片数组可以动态累加,相对有点复杂,若你们的不存在动态添加,只有一条,页面

 :file-list="repairPlanfiles"即可;回显时也不用循环 :给repairPlanfiles添加数组

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值