evel()与table里面循环校验器的结合使用

<el-form :rules="rules" ref="formTableRef" :model="formTable" label-position="top" label-width="100px">
            <el-table :data="formTable.tableData" style="width: 100%">
                <el-table-column prop="month" align="center" label="月份">
                    <template #default="{ row }">
                        <span>{{ row.month }}月</span>
                    </template>
                </el-table-column>
                <el-table-column prop="startDate" align="center" label="开始日期">
                    <template #default="{ row, $index }">
                        <el-form-item :prop="`tableData[${$index}].startDate`" :rules="rules.startDate" :label-width="1">
                            <el-date-picker
                                style="width: 100%"
                                type="date"
                                :clearable="false"
                                @change="changeStartDate(row)"
                                value-format="YYYY-MM-DD"
                                v-model="row.startDate"
                                placeholder="请选择时间"
                            >
                            </el-date-picker>
                        </el-form-item>
                    </template>
                </el-table-column>
                <el-table-column prop="endDate" align="center" label="结束日期">
                    <template #default="{ row, $index }">
                        <el-form-item :prop="`tableData[${$index}].endDate`" :rules="rules.endDate" :label-width="1">
                            <el-date-picker
                                style="width: 100%"
                                type="date"
                                @change="changeStartDate(row)"
                                :clearable="false"
                                value-format="YYYY-MM-DD"
                                v-model="row.endDate"
                                placeholder="请选择时间"
                            >
                            </el-date-picker>
                        </el-form-item>
                    </template>
                </el-table-column>
                <el-table-column prop="costDays" align="center" label="总天数(天)">
                    <template #default="{ row }">
                        <span>{{ row.costDays ? row.costDays : "/" }}</span>
                    </template>
                </el-table-column>
                <el-table-column prop="effectiveDays" align="center" label="工作天数(天)">
                    <template #default="{ row, $index }">
                        <el-form-item :prop="`tableData[${$index}].effectiveDays`" :rules="rules.effectiveDays" :label-width="1">
                            <el-input v-model="row.effectiveDays" @blur="changeWorkDay(row)" placeholder="请填写天数"> </el-input>
                        </el-form-item>
                    </template>
                </el-table-column>
                <el-table-column prop="effectiveHours" align="center" label="有效时间(小时)">
                    <template #default="{ row }">
                        <span>{{ row.effectiveHours ? row.effectiveHours : "/" }}</span>
                        <!-- <span>{{ row.effectiveDays ? parseFloat(row.effectiveDays) * 8 : "/" }}</span> -->
                    </template>
                </el-table-column>
            </el-table>
        </el-form>
const rules = {
    startDate: [
        {
            required: true,
            message: "请选择时间",
            trigger: "blur"
        },
        { validator: testDate, trigger: "blur" }
    ],
    endDate: [
        {
            required: true,
            message: "请选择时间",
            trigger: "blur"
        }
    ],
    effectiveDays: [
        {
            required: true,
            message: "请填写天数",
            trigger: "blur"
        },
        { validator: rule.isZeroTwo, trigger: "blur" }
    ]
};
const testDate = (rules: any, value: any, callback: Function) => {
    if (!value) {
        return new Error("请输入内容");
    } else {
        console.log("rules", eval("formTable.value." + rules.field), formTable.value.tableData[1].startDate);
        console.log("value", value);
        console.log("callback", callback);
    }
};

重点是这个testDate里面,rules.field = "tableData[1].startDate"字符串,想要其与formTable.value.组合只能使用evel(),要么就是解析字符串,evel最简单

另外一种方式去实现效果为,下一个表格行的开始时间得大于上一个表格行的结束时间验证

const testDate = (rules: any, value: any, callback: Function) => {
    if (!value) {
        return new Error("请输入内容");
    } else {
        let b = rules.field;
        let start = b.indexOf("[");
        let end = b.indexOf("]");
        let index = b.substring(start + 1, end); // 获取 [] 中的数字
        if (index > 0) {
            const startDateCurr = new Date(formTable.value.tableData[index].startDate);
            const endDatePrev = new Date(formTable.value.tableData[index - 1].endDate);
            if (startDateCurr <= endDatePrev) {
                callback(new Error("须大于上月的结束时间"));
            } else {
                callback();
            }
        } else {
            callback();
        }
    }
};

 校验规则的坑:

场景:先清空里面的一个时间组件,然后添加年份了之后,下面的table全部清空,但是有校验标红

解决思路1:

nextTick(() => {
                    formTableRef.value.resetFields();
                });

解决思路2:给form表单里面通过v-if="show" 这个为true -false切换,

都得放到nextTick里面去

posted @ 2024-03-15 10:19  影思密达ing  阅读(1)  评论(0编辑  收藏  举报