vue中elementUI表单循环验证

文章详细介绍了如何在Vue.js中进行表单验证,包括在el-form组件中设置model、ref和rules属性,以及如何处理动态循环表单的验证。每个el-form-item通过prop绑定数据,并使用rules进行校验。同时,展示了如何通过js判断并清除验证错误提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

进行验证的步骤

1、表单el-form 添加 :model="form" ref="form" :rules="rules",注意是 :model="form"不是v-model,而后每个el-form-item绑定prop
2、不循环的示例在官网可看
3、循环表单的验证:
 3-1、el-form-item 绑定 :prop="`addList[${index}][orderNum]`" :rules="rules.orderNum"
 	注意不循环的表单每个el-form-item 不需要单独加:rules="rules.orderNum"
 	然后prop的名字要与data中的rules数组对象的名称相同即可
 3-2、js判断时,此处的orderNum也就是data中的rules中的名称
 `this.$refs.form.validateField('orderNum', (valid) => {
      //valid返回的是规则集中写的错误提示信息,如果满足条件,返回的就是空
      if (valid) {
         return this.$refs["form"].clearValidate('orderNum');
        }
   });`
<el-form class="demo-form" :model="form" ref="form" :rules="rules" label-width="100px">
      <el-col :span="12">
        <el-form-item label="名称:" prop="name">
          <el-input clearable v-model="form.name" placeholder="请输入考评名称"></el-input>
        </el-form-item>
      </el-col>
      <el-col :span="12">
        <el-form-item label="选择:" prop="indexId">
          <el-select clearable v-model="form.indexId" placeholder="请选择指标" style="width:100%;" @change="removeHintChange(form.indexId,'indexId')">
            <el-option v-for="item in targetOptions" :key="item.value" :label="item.label" :value="item.value">
            </el-option>
          </el-select>
        </el-form-item>
      </el-col>
      <el-col class="wrap">
        <div class="step" v-for="(item, index) in form.addList" :key="index">
          <div class="stepName">
            步骤{{index+1}}</div>
          <el-form-item label="考试考试考试考试:" class="evaluationPerson" :prop="`addList[${index}][personNameId]`" :rules="rules.personNameId">
            <el-select clearable v-model="item.personNameId" placeholder="请选择人员" @change="removeHintChange(item.personNameId,`addList[${index}][personNameId]`)">
              <el-option v-for="item in personOptions" :key="item.value" :label="item.label" :value="{value:item.value,label:item.label}">
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="顺序:" class="order" :prop="`addList[${index}][orderNum]`" :rules="rules.orderNum">
            <el-input clearable v-model="item.orderNum" @input="changeMemberId($event,index,0)"></el-input>
          </el-form-item>
          <el-form-item label="顺1:" class="weight" :prop="`addList[${index}][ratio]`" :rules="rules.ratio">
            <el-input clearable v-model="item.ratio" @input="changeMemberId($event,index,1)"></el-input>
            <div class="percent">%</div>
          </el-form-item>
          <el-form-item label="备注:" class="remarks" :prop="`addList[${index}][remark]`" :rules="rules.remark">
            <el-input clearable type="textarea" v-model="item.remark" placeholder="部门负责人"></el-input>
            <div class="iconPic" @click="deleteInformation(index)"><i class="el-icon-delete-solid"></i></div>
          </el-form-item>
        </div>
      </el-col>
      <el-col class="addInfor">
        <el-button type="primary" plain size="mini" @click="addInformation">
          <i class="el-icon-plus"></i>添加
        </el-button>
      </el-col>
    </el-form>
data() {
    return {
      dialogShow1: true,
      // 指标选择
      indexId: "",
      targetOptions: [{ label: "11", value: 1 }],
      // 考评人员
      personNameId: "",
      personOptions: [{ label: "22", value: 1 }],
      form: {
        indexId: "",
        // 表单字段列表
        addList: [{ personNameId: "", orderNum: "", ratio: "", remark: "" }],
      },
      // 校验规则
      rules: {
        name: [{ required: true, message: "请输入名称", trigger: "blur" }],
        indexId: [
          { required: true, message: "请选择", trigger: "blur" },
        ],
        personNameId: [
          { required: true, message: "请选择(人员)", trigger: "blur" },
        ],
        orderNum: [{ required: true, message: "请输入顺序", trigger: "blur" }],
        ratio: [{ required: true, message: "请输入权重", trigger: "blur" }],
        remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
      },
    };
  },
// 限制有的输入框只能输入数字
    changeMemberId(val, index, num) {
      if (num === 0) {
        this.form.addList[index].orderNum = val.replace(/[^\d]/g, "");
      } else if (num === 1) {
        this.form.addList[index].ratio = val.replace(/[^\d]/g, "");
      }
    },
    // 强制去掉验证
    removeHintChange(value, name) {
      if (value != null || "" || []) {
        this.$refs.form.validateField(name, (valid) => {
          //valid返回的是规则集中写的错误提示信息,如果满足条件,返回的就是空
          if (valid) {
            return this.$refs["form"].clearValidate(name);
          }
        });
      }
    },
    // 添加步骤
    addInformation() {
      this.form.addList.push({
        personNameId: "",
        orderNum: "",
        ratio: "",
        remark: "",
      });
    },
    // 弹窗 - 删除信息
    deleteInformation(val) {
      if (this.form.addList.length > 1) {
        this.form.addList.splice(val, 1);
      } else {
        this.$message({
          message: "不可全部删除,最少一条新增数据信息",
          type: "warning",
        });
      }
    },

<style scoped lang="scss">
// 弹窗中的内容
.addInfor {
  margin-bottom: 16px;
  display: flex;
  justify-content: end;
}
.wrap {
  max-height: 40vh;
  overflow-y: auto;
}
.step {
  display: flex;
  .stepName {
    white-space: nowrap;
    line-height: 36px;
    color: #606266;
    font-size: 14px;
    font-weight: 700;
  }
}
::v-deep .step .el-form-item__content {
  display: flex;
}
::v-deep .step .evaluationPerson .el-form-item__label {
  width: 150px !important;
}
::v-deep .step .order .el-form-item__label,
::v-deep .step .weight .el-form-item__label,
::v-deep .step .remarks .el-form-item__label {
  width: 70px !important;
}
::v-deep .step .order .el-form-item__content,
::v-deep .step .weight .el-form-item__content,
::v-deep .step .remarks .el-form-item__content {
  margin-left: 70px !important;
}
::v-deep .el-dialog__header {
  font-weight: 700;
}
::v-deep .el-textarea textarea {
  height: 36px;
}
.percent {
  margin-left: 10px;
}
.iconPic {
  margin-left: 10px;
  font-size: 16px;
  color: red;
}
</style>

Element UI 是一套基于 Vue.js 的开源 UI 组件库,它提供了一套丰富的验证功能。如果你想要动态地在 Element UI 中添加或移除验证规则,可以借助 Vue.js 的响应式特性以及 `el-form` 或 `el-input` 等组件的 `rules` 属性。 以下是动态添加和移除验证的基本步骤: 1. **初始化验证**: 首先,在数据中定义一个数组,用于存储验证规则,例如: ```javascript data() { return { dynamicRules: [ { field: 'username', required: true, message: '请输入用户名' } ] }; } ``` 2. **动态设置验证规则**: 当你需要添加新的验证规则时,可以在一个方法里操作这个数组,然后更新 `el-form` 的 `rules` 属性: ```javascript methods: { addRule(field, rule) { this.dynamicRules.push({ field, ...rule }); this.$refs.myForm.validateField(field); }, removeRule(field) { const index = this.dynamicRules.findIndex(r => r.field === field); if (index !== -1) { this.dynamicRules.splice(index, 1); // 如果需要从当前字段移除验证,调用 validateField 更新状态 this.$refs.myForm.validateField(field, { resetFields: true }); } } } ``` 3. **在模板中引用动态规则**: 在 HTML 模板上,你可以通过循环展示这些动态规则,并绑定到相应的单元素: ```html <template> <el-form :model="formData" ref="myForm"> <el-form-item v-for="(rule, index) in dynamicRules" :key="index"> <label>{{ rule.label }}</label> <el-input v-model="formData[field]" :rules="rule"></el-input> </el-form-item> <!-- 添加按钮和移除按钮 --> <button @click="addRule('newField')">新增验证</button> <button @click="removeRule('newField')">删除验证</button> </el-form> </template> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值