elementUI一条el-form-item控制两个必填项

文章介绍了如何在Vue.js应用中优化表单元素,特别是当申请日期需要与时段拼接时。新实现使用两个独立的el-form-item,允许分别设置日期和时段,并且能正确显示必填星号。同时,新方法解决了旧有实现中重置表单时无法清空时段字段的问题,以及不恰当的必填提示显示。

实现效果
申请日期是日期跟时段拼接的
在这里插入图片描述

        <el-form-item label="申请类型" prop="applyType" :rules="[{ required: true, message: '必选', trigger: 'change' }]">
          <el-select v-model="ruleForm.applyType" filterable  placeholder="申请类型" style="width: 100%;">
            <el-option v-for="(value,key) of {1:'日常居家' ,2:'春节居家'}" :value="key" :label="value" :key="key" />
          </el-select>
        </el-form-item>
        <el-form-item label="申请日期" prop="applyDate" :rules="[{ required: true, message: '必选', trigger: 'change' }]" v-if="ruleForm.applyType == 2">
          <el-date-picker v-model="ruleForm.applyDate" type="dates"  placeholder="请选择日期" value-format="yyyy-MM-dd" style="width:100%"  :picker-options="pickerOptions" />
        </el-form-item>
        <el-form-item label="申请日期" v-if="ruleForm.applyType == 1" :class="{'is-required':ruleForm.applyType == 1}">
          <div style="display:flex;justify-content: flex-start;">
          <el-form-item prop="applyDate" :rules="[{required: true, message: '日期必选',trigger:'change'}]">
            <el-date-picker v-model="ruleForm.applyDate" type="date" placeholder="请选择日期" value-format="yyyy-MM-dd"
              style="width:100%" @input="forceUpdate()" :picker-options="pickerOptions" />
          </el-form-item>
          <el-form-item prop="time"  :rules="[{required: true, message: '时段必选',trigger:'change'}]">
            <el-select v-model="ruleForm.time" filterable clearable placeholder="请选择时段" style="width: 100%;">
              <el-option v-for="(item,index) in ['08:30:00','09:00:00','13:30:00']" :key="index" :label="item"
                :value="item" />
            </el-select>
          </el-form-item>
          </div>
        </el-form-item>

需要注意
在这里插入图片描述
el-form-item里面是可以继续套el-form-item的,好处是调用重置方法resetFields()可以将两个表单控件都重置掉
另外需要注意外层的el-form-item 必须加上class属性is-required才会有*号必填显示,is-required是系统定义好的css

原有的实现方式不推荐
原有代码示例

        <el-form-item label="申请日期" prop="applyDate" :rules="[{required: true, validator: validTime,trigger:'change'}]" v-if="ruleForm.applyType == 1">
          <div style="display:flex;justify-content: flex-start;">
            <el-date-picker v-model="ruleForm.applyDate" type="date" placeholder="请选择日期" value-format="yyyy-MM-dd"
              style="width:100%" @input="forceUpdate()" :picker-options="pickerOptions" /> 
            <el-select v-model="ruleForm.time" filterable clearable placeholder="请选择时段" style="width: 100%;">
              <el-option v-for="(item,index) in ['08:30:00','09:00:00','13:30:00']" :key="index" :label="item"
                :value="item" />
            </el-select>
          </div>
        </el-form-item>
      validTime(rule, value, callback) {
        if (!this.ruleForm.applyDate) {
          return callback(new Error('请选择日期!'))
        } else if (!this.ruleForm.time) {
          return callback(new Error('请选择时段!'))
        } else {
          callback()
        }
      },

存在以下不友好地方
在这里插入图片描述

1.填写了一个日期就触发了必填提示,且提示项提示位置不太对(时段应该在后面)
2.调用重置方法resetFields()无法将时段字段置空

Vue.js 中,`el-form-item` 是 Element Plus 或 Element UI 框架中的一个组件,用于表单验证。如果需要同时校验多个必填,可以通过定义多个 `rules` 来实现。 以下是一个完整的示例,展示如何使用 `el-form-item` 同时校验多个必填字段: --- ### 示例代码 ```vue <template> <el-form :model="form" :rules="rules" ref="formRef" label-width="100px"> <!-- 字段1:姓名 --> <el-form-item label="姓名" prop="name"> <el-input v-model="form.name"></el-input> </el-form-item> <!-- 字段2:年龄 --> <el-form-item label="年龄" prop="age"> <el-input v-model="form.age"></el-input> </el-form-item> <!-- 字段3:邮箱 --> <el-form-item label="邮箱" prop="email"> <el-input v-model="form.email"></el-input> </el-form-item> <!-- 提交按钮 --> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> </template> <script> export default { data() { return { form: { name: '', // 姓名 age: '', // 年龄 email: '' // 邮箱 }, rules: { name: [ { required: true, message: '请输入姓名', trigger: 'blur' } ], age: [ { required: true, message: '请输入年龄', trigger: 'blur' }, { pattern: /^[0-9]+$/, message: '年龄必须是数字', trigger: 'blur' } ], email: [ { required: true, message: '请输入邮箱地址', trigger: 'blur' }, { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] } ] } }; }, methods: { submitForm() { this.$refs.formRef.validate((valid) => { if (valid) { alert('表单校验通过!'); } else { console.log('表单校验失败'); return false; } }); } } }; </script> ``` --- ### 上述代码解释 1. **模板部分**: - 使用了 `el-form` 组件,并绑定 `form` 数据模型和 `rules` 校验规则。 - 每个 `el-form-item` 对应一个表单,`prop` 属性指定了该字段的校验规则键名。 - `el-input` 用于输入数据,`v-model` 将输入值与 `form` 数据模型绑定。 2. **脚本部分**: - 定义了 `form` 数据模型,包含三个字段:`name`(姓名)、`age`(年龄)和 `email`(邮箱)。 - 定义了 `rules` 校验规则: - `name` 必须填写。 - `age` 必须填写且只能为数字。 - `email` 必须填写且符合邮箱格式。 - `submitForm` 方法调用 `this.$refs.formRef.validate` 进行表单校验,校验通过后弹出提示框。 3. **校验规则**: - `required: true` 表示该字段为必填- `message` 定义了校验失败时的提示信息。 - `trigger` 定义了触发校验的时机(如 `blur` 表示失去焦点时触发)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值