element动态表单的校验及动态的prop,required使用

本文展示了如何在Vue.js中实现动态表格的表单验证,特别是针对StateRateType字段,通过isStateRateRequired判断是否必填,并进行相关日期和输入值的验证。同时包括了编辑和创建两种模式下的数据处理。
摘要由CSDN通过智能技术生成

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

需求:通过+新增一条数据,通过State Rate Type是否有值确认这一行数据是否必填

 <el-dialog :title="title" :visible.sync="dialogFormVisible" width="1600px" v-if="dialogFormVisible" v-dialogDrag>
      <el-form :model="form" ref="form" :inline="true" label-width="145px" :rules="addFormRules">
  
        <!-- 循环 -->
        <el-row v-for="(item,index) in form.stateRates" :key="item+index">
            <el-form-item label="Stated Rate" :prop="'stateRates.' + index + '.statedRate'" :rules="addFormRules.statedRate" :required="item.isStateRateRequired">
                <el-input
                    v-model="item.statedRate"
                    autocomplete="off"
                    clearable
                    placeholder="Stated Rate"
                    @keyup.native="item.statedRate = oninput(item.statedRate,6)">
                </el-input>
            </el-form-item>
            <el-form-item label="Stated Rate Type" :prop="`stateRates.${index}.statedRateType`" :rules="addFormRules.statedRateType" :required="item.isStateRateRequired">
                <el-select v-model="item.statedRateType" placeholder="Stated Rate Type" clearable filterable @change="changeStatedRateType($event, index)">
                    <el-option
                    v-for="(s, i) in statedRateTypeList"
                    :label="s.name"
                    :value="s.id"
                    :key="s + i"
                    ></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="SR Start Date" :prop="`stateRates.${index}.srStartDate`" :rules="addFormRules.srStartDate" :required="item.isStateRateRequired">
                <el-date-picker
                    class="datePicker"
                    v-model="item.srStartDate"
                    type="date"
                    value-format="yyyy-MM-dd"
                    placeholder="Start Date"
                    :picker-options="pickerOptionsStart"
                    @change="changeSRStartDate($event,index)"
                ></el-date-picker>
            </el-form-item>
            <el-form-item label="SR End Date" prop="srEndDate">
                <el-date-picker
                    class="datePicker"
                    v-model="item.srEndDate"
                    type="date"
                    value-format="yyyy-MM-dd"
                    placeholder="End Date"
                    clearable
                    :picker-options="pickerOptionsEnd"
                    @change="changeSREndDate($event,index)"
                ></el-date-picker>
            </el-form-item>
            <el-form-item label-width="50px">
                <i @click="addStateRates"><svg-icon :icon-class="'plus'"/></i>
                <i @click="deleteStateRates(index)" v-if="form.stateRates.length!=1"><svg-icon :icon-class="'reduce'"/></i>
                
            </el-form-item>
        </el-row>
        <el-form-item label="Status" prop="status">
          <el-select v-model="form.status" placeholder="Status" clearable>
            <el-option
              v-for="(item, index) in statusList"
              :label="item.name"
              :value="item.id"
              :key="item + index"
            ></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="Remark" prop="remark">
          <el-input
            v-model="form.remark"
            autocomplete="off"
            clearable
            placeholder="Remark"
          ></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button
          class="canceldialogformBtn"
          @click="dialogFormVisible = false"
          >Cancel</el-button
        >
        <el-button class="submitdialogformBtn" @click="addOK('form',$api.projectUpdate,'project')"
          >OK</el-button
        >
      </div>
    </el-dialog>

重点:
:prop=“‘stateRates.’ + index + ‘.statedRate’”,或者 :prop=“stateRates.${index}.statedRateType
:rules=“addFormRules.statedRate”
:required=“item.isStateRateRequired”

data() {
        const _this = this
        let validateStatedRate =  (rule, value, callback) => {
            let newArr=rule.field.split('.')
            let currentIndex=newArr[1];
            let currentProp=newArr[2];
            let currentPropBro='';
            if(currentProp==='statedRate'){
                currentPropBro=_this.form.stateRates[currentIndex].statedRate;
            }
            if(value===''&&currentPropBro===''&& _this.form.stateRates[currentIndex].isStateRateRequired){
                callback(new Error('Please Enter StatedRate'))
            }else{
                _this.$refs['form'].clearValidate('stateRates.'+ currentIndex + '.statedRate');
                callback()
            }
        };
        let validateSrStartDate =  (rule, value, callback) => {
            let newArr=rule.field.split('.')
            let currentIndex=newArr[1];
            let currentProp=newArr[2];
            let currentPropBro='';
            if(currentProp==='srStartDate') {
                currentPropBro=_this.form.stateRates[currentIndex].srStartDate;
            }
            if(value===''&&currentPropBro===''&& _this.form.stateRates[currentIndex].isStateRateRequired){
                callback(new Error('Please Enter StartDate'))
            }else{
                _this.$refs['form'].clearValidate('stateRates.'+ currentIndex + '.statedRate');
                callback()
            }
        };
        return {
        	addFormRules: {
        		statedRate: [{validator:validateStatedRate, message: 'Please Enter StatedRate', trigger:'blur'}],
            	srStartDate: [{validator:validateSrStartDate, message: 'Please Choose StartDate', trigger:'change'}]
        	},
        	form: {stateRates: [{statedRate:'',statedRateType:'',srEndDate:'',srStartDate:''}]},
        }
  },
  methods: {
  		newAdd(type,data) {
            this.dialogFormVisible = true;
            if(type == 'edit'){
                this.title = "Edit";
                this.form = {...data}
                this.stateRateQuery(data.entityId) 
            }else {
                this.title = "Create";
                this.$set(this.form,'status',1);
                this.buList = this.BUList
                this.form = {stateRates:[{statedRate:'',statedRateType:'',srEndDate:'',srStartDate:'',isStateRateRequired:false}]};
            } 
           this.statedRateTypeArr = []
        },
  		addStateRates() {
            let stateRates = {statedRate:'',statedRateType:'',srEndDate:this.form.stateRates[0].srEndDate,srStartDate:this.form.stateRates[0].srStartDate,isStateRateRequired:false}
            this.form.stateRates.push(stateRates)
            this.$forceUpdate()
        },
        deleteStateRates(index) {
            this.form.stateRates.splice(index,1)
            this.$forceUpdate()
        },
        changeStatedRateType(val, index) {
            if(this.form.stateRates.length>1) {
                for(let i = 0; i < this.form.stateRates.length - 1; i++) {
                        if(this.form.stateRates[i].statedRateType == this.form.stateRates[i + 1].statedRateType) {
                            this.$message({
                                showClose: true,
                                message: "Duplicate 'State Rate Type' value, please re select",
                                type: 'error',
                                duration:0
                            });
                        }        
                }
            }
            for(let i = 0; i < this.form.stateRates.length; i++) {
                if (val) {
                    this.form.stateRates[index].isStateRateRequired = true;
                }else {
                    this.form.stateRates[index].isStateRateRequired = false;
                }
            }
            this.$forceUpdate()
        },
        stateRateQuery(id) {
            this.$http.myPostJson(this.$api.projectStateRateQuery,{projectId:id}).then(res => {
                if(res.code == 200) {
                    if(res.data.stateRates.length>0){
                        this.$set(this.form,'stateRates',res.data.stateRates )
                        this.stateRates = res.data.stateRates.filter(item => {
                            return item.statedRate || item.statedRateType || item.srEndDate || item.srStartDate
                        }) 
                        if(this.title == 'Edit') {
                            this.form.stateRates.forEach((item,index)=> {
                                if(item.statedRateType){
                                    this.changeStatedRateType(item.statedRateType,index)
                                }
                            })
                        }
                       
                    }else {
                       this.$set(this.form,'stateRates',[{statedRate:'',statedRateType:'',srEndDate:'',srStartDate:'',isStateRateRequired:false}])
                       this.stateRates = []
                    }
                    this.$forceUpdate()     
                }
            })
        },
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用 Vue Element表单验证规则来实现多层循环的动态添加校验规则。下面是一个简单的示例代码,演示了如何使用 v-for 指令循环生成表单项,并动态添加校验规则: ```html <template> <el-form ref="form" :model="formData" :rules="formRules" label-width="100px"> <el-form-item v-for="(item, index) in formItems" :key="index" :label="item.label" :prop="item.prop"> <el-input v-model="formData[item.prop]" :placeholder="item.placeholder"></el-input> </el-form-item> </el-form> </template> <script> export default { data() { return { formData: {}, // 表单数据 formItems: [ // 表单项配置 { label: '姓名', prop: 'name', placeholder: '请输入姓名' }, { label: '年龄', prop: 'age', placeholder: '请输入年龄' }, // ... ], formRules: {} // 表单校验规则 }; }, mounted() { this.generateFormRules(); }, methods: { generateFormRules() { this.formItems.forEach(item => { // 根据不同的表单项生成对应的校验规则 // 这里只是示例,你可以根据实际需求进行修改 this.$set(this.formRules, item.prop, [ { required: true, message: `请输入${item.label}`, trigger: 'blur' }, // 其他校验规则... ]); }); } } }; </script> ``` 在上面的示例中,表单项的配置存储在 `formItems` 数组中,你可以根据实际需求自行修改。在 `generateFormRules` 方法中,通过遍历 `formItems` 数组,动态生成表单校验规则,并将其存储在 `formRules` 对象中。最后,在 `<el-form>` 组件上使用 `:rules` 属性绑定表单校验规则。 这样,你就可以实现多层循环动态添加校验规则的功能了。记得根据实际需求修改校验规则的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zero0985

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值