在 ElementUI 中实现表格内表单的局部校验(只对特定单元格标红而非整行或整个表格)需要一些技巧。以下是几种实现方案:
<el-table :data="tableData">
<el-table-column prop="name" label="姓名">
<template slot-scope="scope">
<el-form-item
:prop="'tableData.' + scope.$index + '.name'"
:rules="nameRules"
:class="{'is-error': scope.row.nameError}">
<el-input v-model="scope.row.name" @blur="validateName(scope.row)"></el-input>
</el-form-item>
</template>
</el-table-column>
</el-table>
<script>
export default {
data() {
return {
tableData: [{ name: '', nameError: false }],
nameRules: [
{ required: true, message: '请输入姓名', trigger: 'blur' }
]
}
},
methods: {
validateName(row) {
this.$refs.form.validateField(`tableData.${this.tableData.indexOf(row)}.name`, (error) => {
row.nameError = !!error
})
}
}
}
</script>
<style>
/* 覆盖默认样式,只对单元格标红 */
.el-table .cell .el-form-item.is-error .el-input__inner {
border-color: #f56c6c;
}
.el-table .cell .el-form-item__error {
position: static;
padding-top: 0;
}
</style>
<el-table :data="tableData">
<el-table-column prop="name" label="姓名">
<template slot-scope="scope">
<el-form :model="scope.row" :ref="'form' + scope.$index">
<el-form-item prop="name" :rules="nameRules">
<el-input v-model="scope.row.name"></el-input>
</el-form-item>
</el-form>
</template>
</el-table-column>
</el-table>
<script>
export default {
data() {
return {
tableData: [{ name: '' }],
nameRules: [
{ required: true, message: '请输入姓名', trigger: 'blur' }
]
}
},
methods: {
validateRow(index) {
this.$refs['form' + index][0].validate((valid) => {
// 处理校验结果
})
}
}
}
</script>
<el-table :data="tableData">
<el-table-column prop="name" label="姓名">
<template slot-scope="scope">
<el-input
v-model="scope.row.name"
:class="{'error-input': scope.row.nameError}"
@blur="validateName(scope.row)">
</el-input>
<div v-if="scope.row.nameError" class="error-message">请输入姓名</div>
</template>
</el-table-column>
</el-table>
<script>
export default {
data() {
return {
tableData: [{ name: '', nameError: false }]
}
},
methods: {
validateName(row) {
row.nameError = !row.name
}
}
}
</script>
<style>
.error-input .el-input__inner {
border-color: #f56c6c;
}
.error-message {
color: #f56c6c;
font-size: 12px;
line-height: 1;
padding-top: 4px;
}
</style>
选择哪种方案取决于你的具体需求,方案一和方案二更适合需要与ElementUI表单校验深度集成的场景,而方案三则提供了最大的灵活性但需要手动实现更多功能。