vue2动态表单验证与表单多层嵌套验证

vue2动态表单验证与表单多层嵌套验证

1、动态验证表单

普通表单验证单项依靠的是prop…而动态生成的表单要用:prop。
动态验证表单的prop属性的格式::prop="‘v-for绑定的数组.’ + index + ‘.v-model绑定的变量’
注意v-for,要将表单的model名写进去
在这里插入图片描述

<el-form
      ref="form"
      :model="form"
      :rules="rules"
      label-position="right"
      label-width="auto"
      size="small"
      style="margin: 20px auto"
    >
      <div
        v-for="(item, index) in form.device.properities"
        :key="index"
        class="text"
      >
        <el-col :lg="7" :md="10" :sm="12" :xl="6" :xs="12">
          <el-form-item
            :label="item.name"
            :prop="'device.properities.' + index + '.value'"
            :rules="[
              {
                type: item.type,
                required: item.force,
                validator: validatorFactror,
                trigger: 'blur',
              },
            ]"
          >
            <el-input v-model="item.value" type="text" />
          </el-form-item>
        </el-col>
      </div>
      <el-form-item style="margin-top: 20px">
          <div>
            <el-button
              type="primary"
              @click.stop="addIotDevMethod('form')"
              >保 存
            </el-button>
          </div>
        </el-form-item>
    </el-form>

<script>
export default {
  data() {
    return {
      form: {
        device:{
        	properities:[]
        }
    };
  },
  },
  method:{
	//验证用户输入的格式
    validatorFactror(rule, value, callback) {
      const ipReg =
        /^(\d{1}|[1-9][0-9]|1\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9][0-9]|1\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9][0-9]|1\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9][0-9]|1\d\d|2[0-4]\d|25[0-5])$/;
      if (value) {
        switch (rule.type) {
          case "ip_addr":
            if (!ipReg.test(value)) {
              callback(new Error("IP地址不合法"));
            } else {
              callback();
            }
            break;
          default:
            callback();
            break;
        }
      } else {
        callback();
      }
    },
    //提交表单时
    addIotDevMethod(formName) {
      this.$refs[formName].validate((valid) => {
        console.log(valid);
        //提交表单前验证表单必填项是否都填写,如果都填写,valid返回true,可以提交表单
        if (valid) {
          //此处编写表单验证通过的业务逻辑
        }
      });
    },
  }
};
</script>

在这里插入图片描述
在这里插入图片描述

2、表单多层嵌套验证

    <el-form
          :model="form"
          :rules="rules"
          label-width="100px"
          size="mini"
          ref="form"
        >
          <el-form-item label="标准标题" prop="title">
            <el-input v-model="form.title" autocomplete="off"> </el-input>
          </el-form-item>
            <div
              v-for="(item, index) in form.items"
              :key="index"
              style="display: flex; align-items: center; margin-bottom: 10px"
            >
              <el-card style="flex: 1" :body-style="{ padding: '10px' }">
                <el-form-item
                  label="项目标题"
                  prop="title"
                  :rules="getRule(item.title, rules.oneRules.title)"
                >
                  <el-input v-model="item.title" autocomplete="off"> </el-input>
                </el-form-item>
                <div
                  v-for="(ele, num) in item.options"
                  :key="num"
                  style="
                    display: flex;
                    align-items: center;
                    margin-bottom: 10px;
                  "
                >
                  <el-card style="flex: 1" :body-style="{ padding: '10px' }">
                    <el-form-item
                      label="内容"
                      prop="content"
                      :rules="
                        getRule(ele.content, rules.oneRules.twoRules.content)
                      "
                    >
                      <el-input
                        type="textarea"
                        :autosize="{ minRows: 2, maxRows: 4 }"
                        v-model="ele.content"
                        autocomplete="off"
                      >
                      </el-input>
                    </el-form-item>

                      <div>
                        <div
                          v-for="(element, idx) in ele.options"
                          :key="idx"
                          style="display: flex"
                        >
                          <el-form-item
                            style="flex: 1"
                            prop="value"
                            :rules="
                              getRule(
                                element.value,
                                rules.oneRules.twoRules.threeRules.value
                              )
                            "
                          >
                            <el-input v-model="element.value"> </el-input>
                          </el-form-item>
                        </div>
                      </div>
                  </el-card>
                </div>
              </el-card>
          </div>
        </el-form>
form: {
        title: "",
        items: [
          {
            title: "",
            options: [
              {
                content: "",
                 options: [
                {
                  key: "",
                  value: "",
                },
              ],
              },
            ],
          },
        ],
      },
      rules: {
        title: [
          {
            required: true,
            message: "标题不能为空",
            trigger: ["blur", "change"],
          },
        ],
        oneRules: {
          title: "项目标题不能为空",
          twoRules: {
            content: "内容不能为空",
            threeRules: {
              value: "不能为空",
            },
          },
        },
      },
    getRule(value, msg) {
      return {
        required: true,
        validator: (rule, v, callback) => {
          if (value === null || value === "") {
            callback(new Error(msg));
          }
          callback();
        },
        trigger: ["change", "blur"],
      };
    },
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue动态表单验证可以通过使用Vue的指令和计算属性来实现。以下是一个简单的示例: 1. 首先,我们需要定义一个包含表单字段的数据对象,并设置验证规则: ``` data() { return { formData: { name: '', email: '', password: '', confirmPassword: '' }, rules: { name: [ { required: true, message: '请输入姓名', trigger: 'blur' } ], email: [ { required: true, message: '请输入邮箱', trigger: 'blur' }, { type: 'email', message: '请输入正确的邮箱格式', trigger: ['blur', 'change'] } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 6, message: '密码长度不能小于6位', trigger: 'blur' } ], confirmPassword: [ { required: true, message: '请再次输入密码', trigger: 'blur' }, { validator: this.validateConfirmPassword, trigger: 'blur' } ] } } }, ``` 2. 接下来,我们需要在模板中使用Vue指令来绑定表单字段和验证规则: ``` <el-form ref="form" :model="formData" :rules="rules"> <el-form-item label="姓名" prop="name"> <el-input v-model="formData.name"></el-input> </el-form-item> <el-form-item label="邮箱" prop="email"> <el-input v-model="formData.email"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="formData.password"></el-input> </el-form-item> <el-form-item label="确认密码" prop="confirmPassword"> <el-input type="password" v-model="formData.confirmPassword"></el-input> </el-form-item> </el-form> ``` 3. 最后,我们需要定义验证函数,并将其作为验证规则的一部分: ``` methods: { validateConfirmPassword(rule, value, callback) { if (value !== this.formData.password) { callback(new Error('两次输入的密码不一致')) } else { callback() } } } ``` 通过这种方式,我们可以轻松地实现动态表单验证,并在用户输入时进行实时验证

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值