场景:表单中的项是由后端返回的,不是前端提前定义好的。
<el-form :model="form" ref="form" :rules="rules" v-if="configLabelData">
<el-form-item
v-for="(item, index) in configLabelData"
:key="index"
:label="item.name + ':'"
label-width="120px"
:prop="item.configKey"
>
<el-checkbox-group v-model="form[item.configKey]">
<el-checkbox
v-for="(_item, _index) in item.values"
:key="_index"
:label="_item.value"
class="form-item"
>{{ _item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
需要注意的点:
1、因为表单上需要绑定v-model来获取此表单项的值,但是要绑的值名称是根据后端数据来的,所以请求回来后端的数据后再渲染整个表单,否则会报错【v-if="configLabelData"】,根据请求到的后端数据动态创建form中的属性
// 请求后赋值【此时已经请求到了后端返回的数据configLabelData】
// 动态往表单中添加对应属性及数据
for (let i = 0; i < this.configLabelData.length; i++) {
let value;
// 根据后端返回的数据类型显示赋值不同的类型
if (this.configLabelData[i].type === "radiobox") {
// radiobox类型绑定的值是字符串
//【row[xxx] || "表示:从表格中拿到值用来回显,若没有值则赋新的空值】
value = row[this.configLabelData[i].configKey] || "";
}
// 创建表单项,用于绑定数据
this.$set(this.form, this.configLabelData[i].configKey, value);
this.$nextTick(() => {
this.$refs["form"].clearValidate();
});
}
2、渲染多个checkbox或者radio时,label绑定值,{{}}中渲染名称,这样v-model拿到的数据可以直接传到后端
3、对动态生成的表单做校验,提前定义好各种数据类型的校验规则:
在data中定义了多选和单选的校验规则:
radioValidator: [
{
required: true,
message: "请选择其中一种",
trigger: "change",
},
],
checkboxValidator: [
{
type: "array",
required: true,
message: "至少选择一种",
trigger: "change",
},
],
在第1步创建表单项的时候同时更新rules
// 请求后赋值【此时已经请求到了后端返回的数据configLabelData】
// 动态往表单中添加对应属性及数据
for (let i = 0; i < this.configLabelData.length; i++) {
let validatorType;
// 根据后端返回的数据类型添加不同的校验规则
if (this.configLabelData[i].type === "checkbox") {
validatorType = this.checkboxValidator;
}
// 创建表单项,用于绑定数据
this.$set(this.rules, this.configLabelData[i].configKey, validatorType);
}
举个例子~后端返回数据格式:
文章来源:https://www.toymoban.com/news/detail-577566.html
文章来源地址https://www.toymoban.com/news/detail-577566.html
到了这里,关于vue element 动态生成表单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!