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里面去

浙公网安备 33010602011771号