大写金额转换及vue使用ElementUI循环表单并实现校验

一、以下代码是一个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>

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张张Z7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值