element-ui 动态表单自定义校验中拿到当前行的数据

 需求:如上图 计划投入天数 = 远程天数 + 现场天数

那么我们就需要拿到当前行的数据去进行自定义校验 计算数值是否相等

可是自定义校验函数中没提供当前行的数据,查询element-ui官网后得知校验规则使用的是async-validator库,通过async-validator库得知 validator 函数中有5个参数。

然后我们把他打印出来发现 还是没有我们想要的数据

但是我们发现 rule中是校验的规则

 

 那么我们的思路就是:可以往这个rule校验规则中添加我们想要的数据,那么在自定义校验中的validate函数中的rule参数中就可以拿到了

接着我们再打印rule对象,里面就有我们添加的row对象了 

 接着我们写自定义校验时 通过 rule.row 就能拿到当前行的数据了,就可以根据当前行的其他数值来决定是否通过校验了

有帮助到你记得点点赞哦~ 

完整代码

<template>
  <div class="app">
    <el-form inline :model="formData" :rules="rules" style="padding: 100px">
      <el-table :data="formData.levelList" style="width: 100%">
        <el-table-column align="center" label="计划投入人天">
          <template v-slot="slotProps">
            <el-form-item
              label=" "
              :rules="rules.plannedDays"
              :prop="'levelList.' + slotProps.$index + '.plannedDays'"
            >
              <el-input
                v-model.number="slotProps.row.plannedDays"
                placeholder="计划投入人天"
              ></el-input>
            </el-form-item>
          </template>
        </el-table-column>
        <el-table-column align="center" label="远程天数">
          <template v-slot="slotProps">
            <el-form-item
              label=" "
              :prop="'levelList.' + slotProps.$index + '.remoteTime'"
              :rules="[
                {
                  ...rules.remoteTime[0],
                  row: slotProps.row,
                },
              ]"
            >
              <el-input
                v-model.number="slotProps.row.remoteTime"
                placeholder="远程天数"
                type="number"
              ></el-input>
            </el-form-item>
          </template>
        </el-table-column>
        <el-table-column align="center" label="现场天数">
          <template v-slot="slotProps">
            <el-form-item
              label=" "
              :prop="'levelList.' + slotProps.$index + '.arrivalTime'"
              :rules="[
                {
                  ...rules.arrivalTime[0],
                  row: slotProps.row,
                },
              ]"
            >
              <el-input
                v-model.number="slotProps.row.arrivalTime"
                placeholder="远程天数"
                type="number"
              ></el-input>
            </el-form-item>
          </template>
        </el-table-column>

        <el-table-column label="删除" align="center" width="60px">
          <template v-slot="slotProps">
            <i
              class="el-icon-remove"
              style="font-size: 20px"
              v-if="slotProps.$index > 0"
              @click="deleteLevelList(slotProps.$index)"
            ></i>
          </template>
        </el-table-column>
      </el-table>
      <el-button
        style="float: right; margin-top: 10px; margin-bottom: 10px"
        type="primary"
        @click="addLevelList()"
      >
        增加
      </el-button>
    </el-form>
  </div>
</template>
<script>
export default {
  name: "app",
  components: {},
  data() {
    return {
      formData: {
        levelList: [
          {
            plannedDays: null, //计划投入人天
            remoteTime: null, //远程天数
            arrivalTime: null, //现场天数
          },
        ],
      },
      // 校验
      rules: {
        plannedDays: [
          {
            required: true,
            message: "请输入计划投入人天",
            trigger: ["change", "blur"],
          },
        ],
        remoteTime: [
          {
            validator: (rule, value, callback, source, options) => {
              console.log(rule, "rule");
              console.log(value, "value");
              console.log(callback, "callback");
              console.log(source, "source");
              console.log(options, "options");
              
              console.log(rule.row, '当前行的数据');

              if (!value) {
                callback(new Error("请输入远程天数"));
              } else if (rule.row.remoteTime && rule.row.arrivalTime) {
                if (
                  Number(rule.row.remoteTime) + Number(rule.row.arrivalTime) !=
                  rule.row.plannedDays
                ) {
                  callback(new Error("远程天数 + 现场天数 = 计划投入人天"));
                } else {
                  callback();
                }
              }
            },
            required: true,
            trigger: "blur",
          },
        ],
        arrivalTime: [
          {
            validator: (rule, value, callback) => {
              if (!value) {
                callback(new Error("请输入现场天数"));
              } else if (rule.row.remoteTime && rule.row.arrivalTime) {
                if (
                  Number(rule.row.remoteTime) + Number(rule.row.arrivalTime) !=
                  rule.row.plannedDays
                ) {
                  callback(new Error("远程天数 + 现场天数 = 计划投入人天"));
                } else {
                  callback();
                }
              }
            },
            required: true,
            trigger: "blur",
          },
        ],
      },
    };
  },
  methods: {
    addLevelList() {
      const newObj = {
        plannedDays: null, //计划投入人天
        remoteTime: null, //远程天数
        arrivalTime: null, //现场天数
      };
      this.formData.levelList.push(newObj);
    },
    deleteLevelList(index) {
      this.formData.levelList.splice(index, 1);
    },
  },
};
</script>
<style scoped>
.app {
  height: 1000px;
  background: #ccc;
}
</style>

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: element-ui的form表单校验可以通过以下步骤实现: 1. 在form表单添加需要校验表单项,例如: ``` <el-form :model="form" :rules="rules"> <el-form-item label="用户名" prop="username"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="form.password"></el-input> </el-form-item> </el-form> ``` 2. 在data定义form和rules对象,例如: ``` data() { return { form: { username: '', password: '' }, rules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' }, { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' } ] } } } ``` 3. 在methods定义submit方法,例如: ``` methods: { submit() { this.$refs.form.validate((valid) => { if (valid) { // 表单校验通过,执提交操作 } else { // 表单校验不通过,提示错误信息 } }); } } ``` 4. 在submit按钮调用submit方法,例如: ``` <el-button type="primary" @click="submit">提交</el-button> ``` 以上就是element-uiform表单校验的基本步骤。需要注意的是,校验规则可以根据实际情况进自定义,例如添加正则表达式校验等。 ### 回答2: element-ui是一款基于Vue.js的UI框架,它提供了一系列常用的组件,其包括表单组件。在element-ui表单组件使用from组件进封装,其内置了表单校验的功能,可以方便地进表单数据的检验和验证。 为了实现表单校验功能,在使用element-ui的from组件时需要对表单各项数据设定,包括表单数据的值,校验规则及提示信息等。element-ui提供了一种便捷的方式来对表单初始化,即通过配置项“rules” 来设置各项表单数据校验规则和提示信息。例如: ``` <el-form ref="loginForm" :model="loginForm" :rules="rules"> <el-form-item label="用户名" prop="username"> <el-input v-model="loginForm.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="loginForm.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('loginForm')">登录</el-button> </el-form-item> </el-form> ``` 在上述代码,我们通过配置项“rules”来设置了表单数据“username”和“password”的校验规则和提示信息,这些规则包括了必填项、长度、格式等。例如校验“username”项的规则如下: ``` rules: { username: [ { required: true, message: '请填写用户名', trigger: 'blur' }, { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' } ], password: [ { required: true, message: '请填写密码', trigger: 'blur' }, { min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' } ] } ``` 在设置完表单的rules之后,我们还需要编写校验逻辑。element-ui提供了一种简便的方式来触发表单校验,即通过调用from组件validate方法。在校验成功时,validate方法会返回一个Promise对象,因此我们可以按照以下方式来使用: ``` methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('提交成功'); } else { return false; } }); }, } ``` 在上述代码,我们通过this.$refs[formName].validate()方法来触发表单校验,并在校验成功时弹出一个提交成功的提示框,否则返回false。同时,还可以通过validate方法的回调函数来进其他的操作,例如在校验失败时显示错误提示信息。 总之,element-ui的from表单校验是一种非常便捷的方式来对表单数据检验和验证,其提供了丰富的校验规则和提示信息,并通过validate方法和回调函数来实现表单校验的逻辑。 ### 回答3: element-ui是一款基于Vue.js的UI框架,提供了一系列方便开发人员快速构建美观易用的Web应用的组件。其,form表单组件是经常使用的一个组件,实现了表单提交和校验的功能。下面对element-uifrom表单校验说明。 1. 校验规则定义 首先,需要定义表单各个输入框的校验规则。element-ui提供了两种定义方式: (1)使用prop属性定义校验规则: 在组件定义prop属性,该属性是一个包含校验规则的对象: <el-form :rules="rules"> <el-form-item label="名称" prop="name"> <el-input v-model="form.name"></el-input> </el-form-item> </el-form> 在js定义rules: data() { return { rules: { name: [ { required: true, message: '请输入名称', trigger: 'blur' } ] } } } 其,rules的属性名必须和form-item组件的prop属性一致。规则数组可以定义多个校验规则,常用的校验规则有: required:必填项。 email:必须是有效的邮箱。 url:必须是有效的URL。 max:输入值最大长度。 min:输入值最小长度。 pattern:自定义正则表达式。 (2)使用validate方法定义校验规则: 在组件定义ref属性: <el-form ref="form" :model="form"> <el-form-item label="名称"> <el-input v-model="form.name" ref="name"></el-input> </el-form-item> </el-form> 使用validate方法设置校验规则: this.$refs.form.validate((valid) => { // valid为true则表示验证通过,否则验证失败 if (valid) { // 处理提交表单等操作 } else { return false; } }); 使用this.$refs.form.clearValidate()方法清除表单校验。 2. 触发校验 触发校验有两种方式:自动校验和手动校验。 (1)自动校验: 自动校验是通过在form组件添加validate-on-change和validate-on-blur属性实现的: <el-form :rules="rules" ref="form" label-position="top" label-width="80px" :model="form" validate-on-change validate-on-blur> <el-form-item label="名称" prop="name"> <el-input v-model="form.name"></el-input> </el-form-item> </el-form> validate-on-change表示在输入框值发生变化时自动触发校验validate-on-blur表示失去焦点时触发校验。 (2)手动校验: 手动校验是通过validate方法实现的,在需要手动校验的地方调用validate方法即可: this.$refs.form.validate((valid) => { // valid为true则表示验证通过,否则验证失败 if (valid) { // 处理提交表单等操作 } else { return false; } }); 在需要清除校验的地方调用this.$refs.form.clearValidate()方法即可。 3. 校验提示 element-ui提供了一种方便的方式来显示校验提示,即在form-item组件添加prop属性和rules属性。当校验失败时,form-item组件会自动显示对应的错误提示信息。 <el-form :rules="rules" ref="form"> <el-form-item label="名称" prop="name" :rules="{required: true, message: '请输入名称'}"> <el-input v-model="form.name"></el-input> </el-form-item> </el-form> 也可以通过自定义校验提示信息显示来实现更加灵活的校验提示信息: <el-form :rules="rules" ref="form"> <el-form-item label="名称" prop="name"> <el-input v-model="form.name"></el-input> <template #error> <span class="error-tips">{{ form.name ? '名称不能为空' : '请输入名称' }}</span> </template> </el-form-item> </el-form> 其,#error是slot的使用方式,表示当校验失败时自定义的错误提示信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值