搭配el-upload的动态新增删除表单+对重复项进行校验

目标效果

1.动态新增删除表单
2.校验规则(重点是upload的上传后清除校验提示)
3.对重复项进行校验,只能想到这种比较复杂的方法,有更好的建议请指教T T 

代码参考

html部分

//html
        <el-form
          ref="editForm"
          :model="editForm"
          :rules="editRules"
          inline
          label-width="140px"
        >
          <h3 class="addTitle">访客信息</h3>
          <div
            class="mainInfo"
            v-for="(item, index) in editForm.powerAttrList"
            :key="index"
          >
            <div class="orderInfo">
                  <el-form-item
                    :prop="`powerAttrList[${index}].userName`"
                    :rules="{
                      required: true,
                      message: '访客名称不能为空',
                      trigger: 'blur'
                    }"
                    :label="editForm.powerAttrList[index].name"
                  >
                    <el-input
                      v-model="item.userName"
                      placeholder="请输入访客名称"
                      name="userName"
                      type="text"
                    ></el-input> </el-form-item
                ><el-form-item
                    :prop="'powerAttrList.' + index + '.userPhone'"
                    label="访客电话:"
                    :rules="phoneRules"
                  >
                    <el-input
                      v-model="item.userPhone"
                      placeholder="请输入访客电话"
                      name="userPhone"
                      type="text"
                    ></el-input> </el-form-item
                >
                  <el-form-item
                    :ref="`powerAttrList[${index}]`"
                    :prop="`powerAttrList[${index}].imgUrl`"
                    label="认证照片:"
                    :rules="{
                      required: true,
                      message: '认证照片不能为空',
                      trigger: 'change'
                    }"
                  >
                    <el-upload
                      class="upload-demo"
                      :action="file.url"
                      accept="image/jpg, image/png, image/jpeg"
                      :limit="1"
                      :on-success="handleAvatarSuccess"
                      :before-upload="checkFileSure"
                      :headers="mytoken"
                      v-model="item.imgUrl"
                    >
                      <el-button
                        size="small"
                        type="primary"
                        @click="getItem(index)"
                        :disabled="btnDisable"
                        >点击上传</el-button
                      ><span
                        slot="tip"
                        class="el-upload__tip"
                        style="margin-left:5px"
                      >
                        只能上传jpg/png文件,且不超过300k</span
                      >
                    </el-upload>
                  </el-form-item>
            </div>
              <el-button
                type="danger"
                class="deleteBtn"
                v-if="editForm.powerAttrList.length > 1 && index !== 0"
                size="small"
                plain
                @click="removeRow(index)"
                >删除</el-button
              >
          </div>
            <el-form-item>
              <el-button
                size="small"
                @click="addVisitor"
                type="primary"
                plain
                v-if="editForm.powerAttrList.length <= 3"
                >新增随行访客</el-button
              >
            </el-form-item>
        </el-form>
 

script部分

data() {
    const validatePhone = (rule, value, callback) => {
      if (value == "") {
        callback(new Error("手机号码不能为空"));
      } else {
        if (!value.match(/^[0-9]{11}$/gi)) {
          callback(new Error("手机号码不正确"));
        } else {
          callback();
        }
      }
    };
    return {
     btnDisable: false,
    //手机号统一使用的自定义校验
      phoneRules: {
        required: true,
        validator: validatePhone,
        trigger: "blur"
      },
      editForm: {
        powerAttrList: [
          {
            userName: "",
            carCard: "",
            userPhone: "",
            belongingIds: [],
            name: "主访客:", //用以写lable,第一个为主访客,后面的都叫随行访客
            imgUrl: ""
          }
        ]
      },
      file: {
        url:
          process.env.VUE_APP_BASE_API +
          "/v-api" +
          "/background/uploadInerUserPic"
      },
      index: "",
      editRules: {
        endTime: [
          { required: true, trigger: "change", message: "预约时间不能为空" }
        ],
        beginTime: [
          { required: true, trigger: "change", message: "预约时间不能为空" }
        ],

        interviewType: [
          { required: true, trigger: "change", message: "来访类型不能为空" }
        ],
        siteId: [
          { required: true, trigger: "blur", message: "请选择来访厂区" }
        ],
        zoneId: [
          { required: true, trigger: "change", message: "请选择可通行楼栋" }
        ],
        employees: [
          { required: true, trigger: "change", message: "请选择被访人" }
        ],
        userName: [
          { required: true, trigger: "blur", message: "请填写访客姓名" }
        ]
      }
    };
  },
  computed: {
    mytoken() {
      return {
        Authorization: `Bearer ${getToken()}`  //upload的请求头
      };
    }
  },

 methods: {
     //点击上传时获取当前未知的index并赋值给表单
   getItem(data) {
      this.index = data;
    },
     // 照片
    handleAvatarSuccess(res, file) {
      this.editForm.powerAttrList[this.index].imgUrl = res.data;
      //清除校验
      //(这里有个bug,由于不是直接赋值在表单里,移除文件后无法清空表单内容)
      this.$refs.editForm.clearValidate(
        "powerAttrList[" + this.index + "].imgUrl"
      );
      this.$message.success("上传成功!");
       this.btnDisable = false;
    },

    checkFileSure(file) {
      const isLt300k = file.size / 1024 / 1024 < 0.3;
      if (!isLt300k) {
        this.$message.warning("上传图片大小不能超过 300kB!");
        return isLt300k;
      }
    },
     //上传照片时禁止上传其他上传事件
    progressDisable() {
      this.btnDisable = true;
    },
    //点击上传时检查是否有重复项
     addOrderInfo() {
      this.$refs.editForm.validate(valid => {
     if (valid) {
          let obj = {
            beginTime: this.editForm.beginTime,
            endTime: this.editForm.endTime,
            intervieweeId: this.editForm.employees,
            orderType: this.editForm.interviewType,
            siteId: this.editForm.siteId,
            zoneId: this.editForm.zoneId,
            visitors: this.editForm.powerAttrList
          };
          //确认可添加
          let auth = true;
          if (this.editForm.powerAttrList.length > 1) {
            //获取重复项
            let newarr = this.editForm.powerAttrList.filter((item, index) => {
              for (let j = 0; j < this.editForm.powerAttrList.length; j++) {
                if (
                  item.userPhone == this.editForm.powerAttrList[j].userPhone &&
                  index != j
                ) {
                  return item;
                }
              }
            });

            if (newarr.length > 0) {
              this.$message.error("不同访客的手机号不能相同!");
              auth = false;
            }
          }
          if (auth) {
            API.addOrder(obj)
              .then(response => {
                this.$message.success("新增成功!");
                this.$refs.mdgDialog.importDialogShown = false;
                this.getList();
              })
              .catch(error => {
                console.log(error);
              });
          }
        }
      });
    },
     // 增加随行访客
    addVisitor() {
      this.editForm.powerAttrList.push({
        beginTime: "",
        endTime: "",
        userName: "",
        carCard: "",
        belongingIds: [],
        name: "随行访客",
        imgUrl: "",
        userPhone: ""
      });
    },
    // 删除属性列
    removeRow(index) {
      this.editForm.powerAttrList.splice(index, 1);
    },

 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值