在使用 Element UI(Element Plus 是其 Vue 3 版本)时,可以通过 el-form 和 el-form-item 组件来创建一个动态表单项,并支持新增和删除操作。为了进行表单校验,你需要使用 el-form 的 rules 属性来定义校验规则。
以下是一个示例,展示了如何创建一个可以动态新增和删除表单项,并包含校验功能的表单:
示例代码
<template>
<div>
<el-form :model="form" :rules="rules" ref="dynamicForm" label-width="120px">
<div v-for="(field, index) in form.fields" :key="field.key" class="form-item">
<el-form-item :label="'Field ' + (index + 1)" :prop="'fields.' + index + '.value'">
<el-input v-model="field.value"></el-input>
</el-form-item>
<el-button type="danger" icon="el-icon-delete" @click="removeField(index)"></el-button>
</div>
<el-form-item>
<el-button type="primary" @click="addField">Add Field</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('dynamicForm')">Submit</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
data() {
return {
form: {
fields: [
{ key: 0, value: '' }
]
},
rules: {
'fields.*.value': [
{ required: true, message: 'This field is required', trigger: 'blur' }
]
}
};
},
methods: {
addField() {
this.form.fields.push({ key: this.form.fields.length, value: '' });
},
removeField(index) {
this.form.fields.splice(index, 1);
},
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
alert('Submit Success!');
} else {
console.log('error submit!!');
return false;
}
});
}
}
};
</script>
<style scoped>
.form-item {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
</style>
关键点解释
-
表单模型(
form):fields数组用于存储动态表单项,每个表单项包含一个key和value。
-
校验规则(
rules):- 使用
fields.*.value作为动态字段的校验规则,其中*表示任意索引。 required: true表示该字段为必填项,message为校验失败时的提示信息,trigger为触发校验的事件(如blur)。
- 使用
-
方法:
addField方法用于新增一个表单项。removeField方法用于删除指定索引的表单项。submitForm方法用于提交表单,并调用validate方法进行校验。
-
模板:
- 使用
v-for指令遍历fields数组,动态生成表单项。 - 每个表单项包含一个
el-form-item和一个删除按钮。 - 添加一个按钮用于新增表单项,并添加一个提交按钮用于提交表单。
- 使用
注意事项
- 由于 Element UI 的校验规则不支持直接对数组中的对象进行校验,所以这里使用了一个变通的方法,通过
fields.*.value来表示任意索引的value字段。 - 如果需要更复杂的校验规则,可以考虑在
addField和removeField方法中动态生成和更新rules对象。
希望这个示例能帮助你实现动态表单项的新增、删除和校验功能。
如何本文章对您有帮助,请帮博主点个赞吧!