一、以下代码是一个demo案例可以直接拿走直接用
<template>
<div>
<p>大写金额:{{ digitUppercase(amount) }}</p>
<div class="content_style">
<div v-for="form in ruleForm" :key="form.key" class="all_content">
<el-button :disabled="ruleForm.length === 1" class="delete_class_form" type="text" @click="deleteForm(ruleForm, form.key)">删除</el-button>
<div class="form1_content">
<el-form
:ref="`ruleForm1-${form.key}`"
class="form"
:model="form.ruleForm1"
label-width="120px"
>
<el-form-item label="清单名称" prop="name" :rules="rules.name">
<el-input v-model="form.ruleForm1.name"></el-input>
</el-form-item>
<el-form-item label="清单类型" prop="type">
<el-select v-model="form.ruleForm1.type" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<div>
<div v-for="(item, j) in form.ruleForm2" :key="item.key" class="form2_content">
<el-form class="form" :ref="`ruleForm2-${item.key}`" :model="item" label-width="120px">
<el-button :disabled="form.ruleForm2.length === 1" class="delete_class_form2" type="text" @click="deleteForm(form.ruleForm2, item.key)">删除</el-button>
<el-form-item :label="`活动名称${j+1}`" prop="name" :rules="rules.name">
<el-input v-model="item.name"></el-input>
</el-form-item>
<el-form-item label="活动类型" prop="type">
<el-select v-model="item.type" placeholder="请选择">
<el-option
v-for="val in options"
:key="val.value"
:label="val.label"
:value="val.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item v-for="(extra, k) in item.extraInfo" :key="extra.key" :label="`备注${k+1}`" :prop="`extraInfo.${k}.value`" :rules="rules.extraInfo">
<el-input v-model="extra.value"></el-input>
<el-button v-if="item.extraInfo.length !== 1" type="text" icon="el-icon-minus" class="delete_extra_class" @click="deleteForm(item.extraInfo, extra.key)">2</el-button>
<el-button v-if="k === item.extraInfo.length-1" type="text" icon="el-icon-plus" class="add_extra_class" @click="addForm(item.extraInfo, 'extra')">11</el-button>
</el-form-item>
</el-form>
</div>
<el-button plain type="text" icon="el-icon-plus" class="add_form2_class" @click="addForm(form.ruleForm2, 'form2')">内</el-button>
</div>
</div>
<el-button plain type="text" icon="el-icon-plus" class="add_form_class" @click="addForm(ruleForm, 'form')">整体添加</el-button>
<div class="button_group">
<el-button type="primary" class="reset" size="small" @click="reset">重置</el-button>
<el-button type="primary" class="confirm" size="small" @click="confirm">确定</el-button>
</div>
</div>
</div>
</template>
<script>
export default{
data(){
return{
amount:4500.4,
ruleForm: [this.getDefaultForm(new Date().getTime())],
options: [
{value: '1',label: '黄金糕'},
{value: '2',label: '双皮奶'},
{value: '3',label: '蚵仔煎'},
{value: '4',label: '龙须面'},
{value: '5',label: '北京烤鸭'}
],
rules: {
name: [{required: true, message: '名称必填', trigger: ['change', 'blur']}],
extraInfo: [{required: true, message: '备注必填', trigger: ['change', 'blur']}],
}
}
},
created() {
console.log('123',this.getDefaultForm(new Date().getTime()))
},
methods: {
digitUppercase(n) {
const fraction = ['角', '分'];
const digit = [
'零', '壹', '贰', '叁', '肆',
'伍', '陆', '柒', '捌', '玖'
];
const unit = [
['元', '万', '亿'],
['', '拾', '佰', '仟']
];
let num = Math.abs(n);
let s = '';
for (let i = 0; i < fraction.length; i++) {
s += (digit[Math.floor(num * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
}
s = s || '整';
num = Math.floor(num);
for (let i = 0; i < unit[0].length && num > 0; i++) {
let p = '';
for (let j = 0; j < unit[1].length && num > 0; j++) {
p = digit[num % 10] + unit[1][j] + p;
num = Math.floor(num / 10);
}
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
}
return s.replace(/(零.)*零元/, '元')
.replace(/(零.)+/g, '零')
.replace(/^整$/, '零元整');
},
// 循环表单
getDefaultForm2(baseKey) {
return {
name: '',
type:'',
key: `${baseKey}-form2`,
extraInfo: [this.getDefaultExtra(baseKey)]
}
},
getDefaultExtra(baseKey) {
return {
value:'',
key: `${baseKey}-extra`
}
},
getDefaultForm(baseKey) {
return {
ruleForm1: {name: '', type: ''},
ruleForm2: [this.getDefaultForm2(baseKey)],
key: `${baseKey}-form1`
}
},
deleteForm(item, key) {
const index = item.findIndex(v => v.key === key)
if(index !== -1) {
item.splice(index, 1)
}
},
addForm(item, type) {
const baseKey = new Date().getTime()
const addMethod = {
extra: this.getDefaultExtra,
form: this.getDefaultForm,
form2: this.getDefaultForm2
}[type]
console.log('addform',addMethod(baseKey))
item.push(addMethod(baseKey))
},
reset() {
this.ruleForm = [this.getDefaultForm(new Date().getTime())];
},
checkForm1() {
const checkPromise = this.ruleForm.map(v => this.$refs?.[`ruleForm1-${v.key}`]?.[0]?.validate())
return checkPromise
},
checkForm2() {
const checkPromise = this.ruleForm?.reduce((p, c) => [...p, ...c.ruleForm2], [])?.map(v => this.$refs?.[`ruleForm2-${v.key}`]?.[0]?.validate())
return checkPromise
},
confirm() {
const checkPromise = [...this.checkForm1(), ...this.checkForm2()]
console.log('456',checkPromise)
Promise.all(checkPromise).then((resArr) => {
if(resArr.every(v => v)) {
this.$confirm('确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$message({
type: 'success',
message: '提交成功'
});
}).catch(() => {});
}
}).catch(() => {})
}
},
}
</script>
<style lang="less" scoped>
::v-deep.el-input {
width: 200px
}
.add_form2_class,.add_form_class {
width: 100%;
border: 1px solid #ddd;
}
.all_content, .form2_content, .form1_content {
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ddd;
border-radius: 4px;
text-align: left;
position: relative;
}
.all_content {
text-align: end;
}
.delete_class_form2 {
position: absolute;
right: 10px;
margin-bottom: 10px;
z-index: 10;
}
.content_style {
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ddd;
border-radius: 4px;
}
.button_group {
padding: 20px 0 10px 0;
text-align: center;
}
</style>
二、以下我跟以上案例根据自己所需进行的修改
<template>
<div>
<el-card shadow="always" class="elcart" :body-style="{padding:'25px 20px 10px 20px'}" v-for="(marInstruc,dicx) in marInstrucList" :key="dicx">
<el-form :model="marInstruc" :ref="`marInstruc-${dicx}`" :inline="true" label-width="200px" class="increase-form">
<el-row>
<el-col :span="12">
<el-form-item label="婚姻状态:" prop="marStatus" class="increase-form-item" :rules="rules.marStatus">
<el-select v-model="marInstruc.marStatus" placeholder="请选择" clearable >
<el-option v-for="dict in maritalStatusList" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="本人姓名:" prop="name" class="increase-form-item" >
<el-input v-model="marInstruc.name" placeholder="请输入本人姓名" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="性别:" prop="sex" class="increase-form-item">
<el-select v-model="marInstruc.sex" placeholder="请选择" clearable>
<el-option v-for="dict in sexList" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="民族:" prop="nation" class="increase-form-item" >
<el-select v-model="marInstruc.nation" placeholder="请选择" clearable>
<el-option v-for="dict in nationList" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="证件号码:" prop="identNo" class="increase-form-item" >
<el-input v-model="marInstruc.identNo" placeholder="请输入证件号码" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="婚姻-离异、丧偶日期:" prop="time" class="increase-form-item">
<el-date-picker placeholder="请选择" type="date" value-format="yyyy-MM-dd" v-model="marInstruc.time" clearable @change="liyiBegin($event,dicx)"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="婚姻-离异、丧偶后再婚日:" prop="digamyTime" class="increase-form-item" >
<el-date-picker placeholder="请选择" type="date" value-format="yyyy-MM-dd" v-model="marInstruc.digamyTime" @change="liyiEnd($event,dicx)" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="抵押合同编号:" prop="pledgeNo" class="increase-form-item" :rules="rules.pledgeNo">
<el-input v-model="marInstruc.pledgeNo" placeholder="请输入抵押合同编号" clearable :disabled="qudaoSource == 1?true:false" />
</el-form-item>
</el-col>
</el-row>
<el-row >
<el-col :span="12">
<el-form-item label="抵押物权利类型:" prop="pledgeType" class="increase-form-item" :rules="rules.pledgeType">
<el-select v-model="marInstruc.pledgeType" placeholder="请选择" clearable >
<el-option v-for="dict in pledgeTypeList" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="marInstruc.marStatus != 1 && marInstruc.marStatus != 2 && marInstruc.marStatus != 3 && marInstruc.marStatus != 4 && marInstruc.marStatus != 5">
<el-form-item label="其他:" prop="other" class="increase-form-item" :rules="rules.other">
<el-input v-model="marInstruc.other" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</template>
<script>
import Bus from '@/utils/bus.js'
import moment from 'moment'
export default{
data(){
return{
rules:{
// name:[
// {required:true,message:'姓名不能为空',trigger:'blur'},
// ],
// liveAddress:[
// {required:true,message:'住所地不能为空',trigger:'blur'},
// ],
// nation:[
// {required:true,message:'请选择',trigger:'change'},
// ],
// time:[
// {required:true,message:'请选择时间',trigger:'change'},
// ],
// digamyTime:[
// {required:true,message:'请选择',trigger:'change'},
// ],
pledgeNo:[
{required:true,message:'押物合同不能为空',trigger:'blur'},
],
pledgeType:[
{required:true,message:'请选择',trigger:'blur'},
],
marStatus:[
{required:true,message:'请选择',trigger:'change'},
],
other:[
{required:true,message:'请输入',trigger:'blur'},
],
},
marInstrucList:[],
}
},
props:{
ysDetailInfo:{
type:Object,
default:() => {}
},
ysBaseInfo:{
type:Object,
default:() => {}
},
orderDetailData:{
type:Object,
default:() => {}
},
sexList:{
type:Array,
default:() => []
},
nationList:{
type:Array,
default:() => []
},
pledgeTypeList:{
type:Array,
default:() => []
},
qudaoSource:{
type:String,
default:'2'
},
maritalStatusList:{
type:Array,
default:() => []
}
},
created(){
// 婚姻状况
// this.getDicts("dzqy_mar_status").then((response) => {
// this.maritalStatusList = response.data;
// });
this.getMarInstrucInfo()
},
methods:{
getMarInstrucInfo(){
let perGuaItems = this.ysDetailInfo.marInstrucList;
perGuaItems.forEach( el => {
if(this.qudaoSource == 1){
if(el.marStatus == null){
if(this.ysDetailInfo.orderBase && this.ysDetailInfo.orderBase != null){
let status = this.ysDetailInfo.orderBase.orderContractInfo.marStatus
if(status && status != null && status != ''){
el.marStatus = this.ysDetailInfo.orderBase.orderContractInfo.marStatus
}
}
}
// pledgeNo pledgeType
el.pledgeNo = el.pledge.pledgeContractNo
if( el.pledgeType != null && el.pledgeType != ''){
}else{
el.pledgeType = el.pledge.pledgeType
}
}else{
if(el.pledgeNo == null || el.pledgeNo == ''){
if(el.pledge.pledgeContractNo != null && el.pledge.pledgeContractNo != ''){
el.pledgeNo = el.pledge.pledgeContractNo
}
}
Bus.$on('pledgeContractNo',(res)=>{
el.pledgeNo = res
})
}
if(el.personList && el.personList.length > 0){
if(el.name != null && el.name != ''){
}else{
el.name = el.personList.map(item => item.name).join(',')
}
if(el.identNo != null && el.identNo != ''){
}else{
el.identNo = el.personList.map(item => item.identNo).join(',')
}
}
})
this.marInstrucList = perGuaItems
},
// 开始
liyiBegin(event,key){
const newDate = moment(new Date()).format('YYYY-MM-DD')
if(event != null && event != ''){
const landstartdate = moment(event).format('YYYY-MM-DD')
if (landstartdate > newDate) {
this.marInstrucList[key].time = ''
this.msgError('日期不能大于当前日期')
}
}
},
// 结束
liyiEnd(event,key){
const newDate = moment(new Date()).format('YYYY-MM-DD')
if(event != null && event != ''){
const landstartdate = moment(event).format('YYYY-MM-DD')
if (landstartdate > newDate) {
this.marInstrucList[key].digamyTime = ''
this.msgError('日期不能大于当前日期')
}
}
},
// 表单校验
submitValid(){
let flag = null
this.marInstrucList.forEach( (el,key) => {
this.$refs[`marInstruc-${key}`][0].validate((valid) => {
if(valid){
flag = true
}else{
console.log('校验失败')
const errorFields = this.$refs[`marInstruc-${key}`][0].fields.filter(
field => field.validateState === 'error'
)
if(errorFields.length > 0){
errorFields[0].$el.scrollIntoView({behavior:'smooth'})
}
flag = false
return false;
}
})
})
return flag
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.increase-form ::v-deep .el-form-item__label{
text-align: center;
font-size: 13px;
background-color: rgb(248, 248, 249);
font-weight: 700;
padding: 0;
margin-right: 7px;
}
.increase-form-item{
width:100%;
// border:1px solid red;
}
.increase-form-item ::v-deep .el-form-item__content{
width: calc(100% - 230px);
}
.increase-form-item ::v-deep .el-date-editor.el-input, .el-date-editor.el-input__inner{
width: 100%;
}
.btns-wrapper {
display: flex;
margin-top: 20px;
justify-content: center;
.oper-btn {
margin: 0 10px;
}
}
::v-deep .el-upload-list__item:first-child{
margin-top:-30px;
}
.elcart{
margin-top:10px;
}
</style>