最近遇到个需求,动态表单,可以通过按钮增加表单项,大体是这样的:
代码如下:
<div class="operate">
<span>报文过滤</span>
<div class="operate-right">
<div class="operate-btn">
<el-button
size="medium"
type="primary"
icon="el-icon-plus"
@click.prevent="addExp()"
>新增过滤条件</el-button>
<el-button
size="medium"
type="primary"
icon="el-icon-folder-checked"
@click.prevent="testExp"
>报文过滤测试</el-button>
</div>
<div class="exp">
<el-form-item label="报文操作" prop="operate">
<el-select v-model="form.operate" clearable placeholder="请选择方式" class="filter-item">
<el-option v-for="item in tablelList" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<template v-for="(item, index) in form.expItem">
<el-form-item
label="正则表达式"
:prop="'expItem.' + index +'.exp'"
:key="index"
:rules="{required: true, message: '请输入表达式', trigger: 'blur'}"
>
<el-input v-model="item.exp" style="width: 370px;" />
<el-button
size="mini"
type="danger"
icon="el-icon-delete"
@click="removeExp(item,index)"
>删除</el-button>
</el-form-item>
</template>
</div>
</div>
</div>
js部分:
addExp() {
this.form.expItem.push({
exp: null
});
},
removeExp(item, index) {
if (this.form.expItem.length <= 1) {
this.$notify({
title: '警告',
message: '至少填写一条',
type: 'warning'
});
return;
}
this.form.expItem.splice(index, 1);
},
遇到的问题
逻辑还是很好实现的,就是通过循环一个表单数组,动态向数组添加或者删除项,但是在验证表单项的时候却遇到个问题,直接写:prop="expItem"时,虽然有必填的*号,但是并未做验证,搜索一圈后发现这里的:prop绑定的有问题,这里应该写成:prop="'v-for绑定的数组.' + index + '.v-model绑定的变量'" , 我这里就是:prop="'expItem.' + index +'.exp'" , 这样就做到了每一项都做到了验证