当前位置:实例文章 » HTML/CSS实例» [文章]Element-UI 实现动态增加多个不同类型的输入框并校验(双重v-for表单验证)

Element-UI 实现动态增加多个不同类型的输入框并校验(双重v-for表单验证)

发布人:shili8 发布时间:2025-02-12 00:41 阅读次数:0

**Element-UI 实现动态增加多个不同类型的输入框并校验**

在实际开发中,我们经常需要实现一个功能:用户可以动态添加多个相同或不同的表单项,例如输入框、选择器、复选框等。同时,还需要对这些表单项进行验证。在 Element-UI 中,可以使用双重 v-for 来实现这个功能。

**第一步:定义表单结构**

首先,我们需要定义一个表单结构的 JSON 对象,来描述每个表单项的类型和属性。

jsonconst formStructure = [
 {
 label: '输入框',
 type: 'input',
 props: {
 placeholder: '请输入内容'
 }
 },
 {
 label: '选择器',
 type: 'select',
 props: {
 options: [
 { value: '选项1', label: '选项1' },
 { value: '选项2', label: '选项2' }
 ]
 }
 },
 {
 label: '复选框',
 type: 'checkbox',
 props: {}
 }
]

**第二步:创建表单组件**

接下来,我们需要创建一个表单组件,来渲染这些表单项。
html<template>
 <div>
 <!-- 表单结构 -->
 <el-form :model="form" ref="form">
 <el-row v-for="(item, index) in formStructure" :key="index">
 <el-col :span="12">
 <el-form-item :label="item.label" :prop="'fields.' + index + '.value'">
 <!-- 根据类型渲染不同的表单项 -->
 <template v-if="item.type === 'input'">
 <el-input v-model="form.fields[index].value" :placeholder="item.props.placeholder"></el-input>
 </template>
 <template v-else-if="item.type === 'select'">
 <el-select v-model="form.fields[index].value" :placeholder="item.props.placeholder">
 <el-option v-for="(option, index) in item.props.options" :key="index" :label="option.label" :value="option.value"></el-option>
 </el-select>
 </template>
 <template v-else-if="item.type === 'checkbox'">
 <el-checkbox-group v-model="form.fields[index].value">
 <el-checkbox v-for="(option, index) in item.props.options" :key="index" :label="option.value"></el-checkbox>
 </el-checkbox-group>
 </template>
 </el-form-item>
 </el-col>
 </el-row>
 </el-form>
 </div>
</template>

<script>
export default {
 data() {
 return {
 form: {
 fields: []
 }
 }
 },
 mounted() {
 // 初始化表单结构 this.form.fields = JSON.parse(JSON.stringify(this.formStructure));
 }
}
</script>

**第三步:实现双重 v-for 表单验证**

最后,我们需要在表单提交时,使用双重 v-for 来验证每个表单项的值。
html<template>
 <div>
 <!-- 表单结构 -->
 <el-form :model="form" ref="form">
 <!-- 双重 v-for 验证 -->
 <el-row v-for="(item, index) in form.fields" :key="index">
 <el-col :span="12">
 <el-form-item :label="item.label" :prop="'fields.' + index + '.value'">
 <!-- 根据类型渲染不同的表单项 -->
 <template v-if="item.type === 'input'">
 <el-input v-model="form.fields[index].value" :placeholder="item.props.placeholder"></el-input>
 </template>
 <template v-else-if="item.type === 'select'">
 <el-select v-model="form.fields[index].value" :placeholder="item.props.placeholder">
 <el-option v-for="(option, index) in item.props.options" :key="index" :label="option.label" :value="option.value"></el-option>
 </el-select>
 </template>
 <template v-else-if="item.type === 'checkbox'">
 <el-checkbox-group v-model="form.fields[index].value">
 <el-checkbox v-for="(option, index) in item.props.options" :key="index" :label="option.value"></el-checkbox>
 </el-checkbox-group>
 </template>
 </el-form-item>
 </el-col>
 </el-row>
 </el-form>
 </div>
</template>

<script>
export default {
 data() {
 return {
 form: {
 fields: []
 }
 }
 },
 mounted() {
 // 初始化表单结构 this.form.fields = JSON.parse(JSON.stringify(this.formStructure));
 },
 methods: {
 submitForm() {
 // 双重 v-for 验证 for (let i =0; i < this.form.fields.length; i++) {
 const item = this.form.fields[i];
 if (!item.value) {
 this.$message.error(`表单项 ${item.label} 必须填写`);
 return false;
 }
 }
 // 表单提交 console.log(this.form);
 return true;
 }
 }
}
</script>

通过以上步骤,我们可以实现动态增加多个不同类型的输入框并校验。

其他信息

其他资源

Top