computed实现简单的动态表单校验

8 篇文章 0 订阅
1 篇文章 0 订阅

有的业务会遇到表单的部分字段在特定的情况下发生校验,例如在下面的场景,当你选择了计量单位的时候,重量是必填的,但是不选择计量单位的时候,重量不是必填项,这个时候我们可以用computed来写校验规则:

     <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="160px" class="demo-ruleForm" :validate-on-rule-change="false">
        <el-row>
          <el-col :span="12">
            <el-form-item label="计量单位:">
              <el-select size="small" v-model="ruleForm.unitId" placeholder="请选择计量单位">
                <el-option
                    v-for="item in matUnits"
                    :label="item.unitName"
                    :key="item.unitId"
                    :value="item.unitId">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="重量:" prop='meterWeight'>
              <el-input size="small" v-model.number="ruleForm.meterWeight" placeholder="请输入重量"  @input="change($event)"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
 computed:{
    rules(){
      return {
        meterWeight: [
          {required: this.ruleForm.unitId ? true : false, message: '请填写重量!', trigger: 'blur' }
        ],
      }
    }
  },

 但是要注意,el-form有个validate-on-rule-change属性默认是true,每一次rules发生变化的时候都会触发一次验证,如果不是业务需要,可以将它设置为false,在提交的时候统一触发校验。

以上,以后遇到这样的业务,就可以使用computed实现简单的表单的动态校验了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 中,可以使用 `v-model` 和 `watch` 以及 `computed` 来实现动态表单校验规则。以下是一个简单的例子: 1. 在组件中定义一个对象,用于存储表单数据和校验规则: ``` <template> <form> <input v-model="formData.name"> <span v-if="errors.name">{{ errors.name }}</span> </form> </template> <script> import { defineComponent, reactive, watch } from 'vue'; export default defineComponent({ setup() { const formData = reactive({ name: '', }); const rules = reactive({ name: [ { required: true, message: '请输入姓名', trigger: 'blur', }, { min: 2, max: 10, message: '长度在 2 到 10 个字符', trigger: 'blur', }, ], }); const errors = reactive({}); watch(formData, () => { const validator = new Promise((resolve, reject) => { const errors = {}; for (const key in rules) { const rule = rules[key]; const value = formData[key]; for (const r of rule) { if (r.required && !value) { errors[key] = r.message; reject(errors); return; } if (r.min && value.length < r.min) { errors[key] = r.message; reject(errors); return; } if (r.max && value.length > r.max) { errors[key] = r.message; reject(errors); return; } } } resolve(); }); validator .then(() => { errors.name = ''; }) .catch((errors) => { errors.name = errors.name; }); }); return { formData, errors, }; }, }); </script> ``` 2. 在模板中使用 `v-model` 绑定表单数据,使用 `v-if` 显示错误信息。 3. 在 `watch` 中监听表单数据的变化,并根据校验规则进行校验,将错误信息存储到 `errors` 对象中。 4. 使用 `reactive` 创建响应式对象,以便在模板中动态显示错误信息。 这是一个基本的例子,你可以根据需要对其进行扩展和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值