vue element el-form 多級嵌套驗(yàn)證的實(shí)現(xiàn)示例
最近在做項(xiàng)目時(shí)遇到這樣一個(gè)需求,一個(gè)form表單里面有兩個(gè)字段數(shù)量不固定,可以動(dòng)態(tài)的增刪,在提交的時(shí)候不管數(shù)量有多少都需要驗(yàn)證,頁面效果如下:

form表單對應(yīng)的數(shù)據(jù)結(jié)構(gòu)如下:
voucherInfo: {
cash: [
{
cashNum: '', // 押金流水號
cashPayType: null, // 押金支付類型
}
],
cashPayTime: '', // 押金支付時(shí)間
cashPayVoucher: [], // 押金支付憑證
commissionNum: '', // 傭金流水號
commissionPayType: null, // 傭金支付方式
commissionPayTime: '', // 傭金支付時(shí)間
commissionPayVoucher: [], // 傭金支付憑證
remark: '' // 備注
}
在這里主要考慮的就是如何驗(yàn)證voucherInfo的第一個(gè)字段,它是一個(gè)數(shù)組,數(shù)組里面又是一個(gè)對象,我們要驗(yàn)證這個(gè)對象的每個(gè)屬性,簡而言之,就是驗(yàn)證對象里面的數(shù)組里面的對象屬性。
方法一:el-form里面再嵌套一個(gè)el-form
<el-form
ref="voucherForm"
:rules="voucherRule"
:model="voucherInfo"
label-width="140px"
>
<div
v-for="(item, index) in voucherInfo.cash"
:key="index"
>
<!-- 嵌套的el-form model綁定的是voucherInfo.cash里面的對象 -->
<!-- 又定義了一個(gè)rules :rules="subVoucherRule"-->
<el-form
ref="subVoucherForm"
:model="item"
:rules="subVoucherRule"
label-width="140px"
>
<el-row>
<el-col :span="6">
<el-form-item
prop="cashNum"
:label="'押金流水號' + (index + 1)"
>
<el-input
v-model="item.cashNum"
palceholder="請輸入"
>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
:label="'押金支付方式' + (index + 1)"
prop="cashPayType"
>
<el-select
v-model="item.cashPayType"
placeholder="請選擇"
>
<el-option
v-for="i in cashPayTypeOptions"
:label="i.label"
:value="i.value"
:key="i.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-button
type="primary"
icon="el-icon-minus"
circle
@click="handleMinusClick(index)"
>
</el-button>
<el-button
type="primary"
icon="el-icon-plus"
circle
@click="handleAddClick()"
>
</el-button>
</el-col>
</el-row>
</el-form>
</div>
<el-row>
<el-col :span="6">
<el-form-item label="押金支付時(shí)間" prop="cashPayTime">
<el-date-picker
v-model="voucherInfo.cashPayTime"
placeholder="請選擇"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上傳支付憑證" prop="cashPayVoucher">
<el-upload
class="avatar-upload"
action=""
>
<img v-if="voucherInfo.cashPayVoucher.length" src="" alt="" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="傭金流水號" prop="commissionNum">
<el-input
v-model="voucherInfo.commissionNum"
placeholder="請輸入"
>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="傭金支付方式" prop="commissionPayType">
<el-select
v-model="voucherInfo.commissionPayType"
placeholder="請選擇"
>
<el-option
v-for="item in commissionPayTypeOptions"
:label="item.label"
:value="item.value"
:key="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="傭金支付時(shí)間" prop="commissionPayTime">
<el-date-picker
v-model="voucherInfo.commissionPayTime"
placeholder="請選擇"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="傭金支付憑證" prop="commissionPayVoucher">
<el-upload
class="avatar-upload"
action=""
>
<img v-if="voucherInfo.commissionPayVoucher.length" src="" alt="" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="備注">
<el-input
type="textarea"
placeholder="請輸入"
v-model="voucherInfo.remark"
>
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
驗(yàn)證規(guī)則:
voucherRule: {
cashPayTime: [{ required: true, message: '請選擇押金支付時(shí)間', trigger: 'change'}],
cashPayVoucher: [{ required: true, message: '請上傳押金支付憑證', trigger: 'change'}],
commissionNum: [{ required: true, message: '請輸入傭金流水號', trigger: 'blur'}],
commissionPayType: [{ required: true, message: '請選擇傭金支付方式', trigger: 'change'}],
commissionPayTime: [{ required: true, message: '請選擇傭金支付時(shí)間', trigger: 'change'}],
commissionPayVoucher: [{ required: true, message: '請上傳傭金支付憑證', trigger: 'change'}],
},
subVoucherRule: {
cashNum: [{ required: true, message: '請輸入押金流水號', trigger: 'blur'}],
cashPayType: [{ required: true, message: '請選擇押金支付方式', trigger: 'change'}],
}
提交時(shí)驗(yàn)證代碼:因?yàn)橛袃蓚€(gè)form,所以兩個(gè)都需要驗(yàn)證
<el-form
ref="voucherForm"
:rules="voucherRule"
:model="voucherInfo"
label-width="140px"
>
<el-row
v-for="(item, index) in voucherInfo.cash"
:key="index"
>
<el-col :span="6">
<!--注意有改動(dòng)的是這里 prop動(dòng)態(tài)綁定cashNum rules寫在了這里 -->
<el-form-item
:prop="'cash['+index+'].cashNum'"
:label="'押金流水號' + (index + 1)"
:rules="{
required: true, message: '請輸入押金流水號', trigger: 'blur'
}"
>
<el-input
v-model="item.cashNum"
palceholder="請輸入"
>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<!--注意有改動(dòng)的是這里 prop動(dòng)態(tài)綁定cashPayType rules寫在了這里 -->
<el-form-item
:label="'押金支付方式' + (index + 1)"
:prop="'cash['+ index +'].cashPayType'"
:rules="{
required: true, message: '請選擇押金支付方式', trigger: 'change'
}"
>
<el-select
v-model="item.cashPayType"
placeholder="請選擇"
>
<el-option
v-for="i in cashPayTypeOptions"
:label="i.label"
:value="i.value"
:key="i.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-button
type="primary"
icon="el-icon-minus"
circle
@click="handleMinusClick(index)"
>
</el-button>
<el-button
type="primary"
icon="el-icon-plus"
circle
@click="handleAddClick()"
>
</el-button>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="押金支付時(shí)間" prop="cashPayTime">
<el-date-picker
v-model="voucherInfo.cashPayTime"
placeholder="請選擇"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上傳支付憑證" prop="cashPayVoucher">
<el-upload
class="avatar-upload"
action=""
>
<img v-if="voucherInfo.cashPayVoucher.length" src="" alt="" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="傭金流水號" prop="commissionNum">
<el-input
v-model="voucherInfo.commissionNum"
placeholder="請輸入"
>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="傭金支付方式" prop="commissionPayType">
<el-select
v-model="voucherInfo.commissionPayType"
placeholder="請選擇"
>
<el-option
v-for="item in commissionPayTypeOptions"
:label="item.label"
:value="item.value"
:key="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="傭金支付時(shí)間" prop="commissionPayTime">
<el-date-picker
v-model="voucherInfo.commissionPayTime"
placeholder="請選擇"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="傭金支付憑證" prop="commissionPayVoucher">
<el-upload
class="avatar-upload"
action=""
>
<img v-if="voucherInfo.commissionPayVoucher.length" src="" alt="" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="備注">
<el-input
type="textarea"
placeholder="請輸入"
v-model="voucherInfo.remark"
>
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
方法二:直接把驗(yàn)證規(guī)則寫在html中
<el-form
ref="voucherForm"
:rules="voucherRule"
:model="voucherInfo"
label-width="140px"
>
<el-row
v-for="(item, index) in voucherInfo.cash"
:key="index"
>
<el-col :span="6">
<!--注意有改動(dòng)的是這里 prop動(dòng)態(tài)綁定cashNum rules寫在了這里 -->
<el-form-item
:prop="'cash['+index+'].cashNum'"
:label="'押金流水號' + (index + 1)"
:rules="{
required: true, message: '請輸入押金流水號', trigger: 'blur'
}"
>
<el-input
v-model="item.cashNum"
palceholder="請輸入"
>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<!--注意有改動(dòng)的是這里 prop動(dòng)態(tài)綁定cashPayType rules寫在了這里 -->
<el-form-item
:label="'押金支付方式' + (index + 1)"
:prop="'cash['+ index +'].cashPayType'"
:rules="{
required: true, message: '請選擇押金支付方式', trigger: 'change'
}"
>
<el-select
v-model="item.cashPayType"
placeholder="請選擇"
>
<el-option
v-for="i in cashPayTypeOptions"
:label="i.label"
:value="i.value"
:key="i.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-button
type="primary"
icon="el-icon-minus"
circle
@click="handleMinusClick(index)"
>
</el-button>
<el-button
type="primary"
icon="el-icon-plus"
circle
@click="handleAddClick()"
>
</el-button>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="押金支付時(shí)間" prop="cashPayTime">
<el-date-picker
v-model="voucherInfo.cashPayTime"
placeholder="請選擇"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上傳支付憑證" prop="cashPayVoucher">
<el-upload
class="avatar-upload"
action=""
>
<img v-if="voucherInfo.cashPayVoucher.length" src="" alt="" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="傭金流水號" prop="commissionNum">
<el-input
v-model="voucherInfo.commissionNum"
placeholder="請輸入"
>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="傭金支付方式" prop="commissionPayType">
<el-select
v-model="voucherInfo.commissionPayType"
placeholder="請選擇"
>
<el-option
v-for="item in commissionPayTypeOptions"
:label="item.label"
:value="item.value"
:key="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="傭金支付時(shí)間" prop="commissionPayTime">
<el-date-picker
v-model="voucherInfo.commissionPayTime"
placeholder="請選擇"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="傭金支付憑證" prop="commissionPayVoucher">
<el-upload
class="avatar-upload"
action=""
>
<img v-if="voucherInfo.commissionPayVoucher.length" src="" alt="" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="備注">
<el-input
type="textarea"
placeholder="請輸入"
v-model="voucherInfo.remark"
>
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
這樣驗(yàn)證的時(shí)候只需要驗(yàn)證一個(gè)表單就行了。
最終的實(shí)現(xiàn)效果:

到此這篇關(guān)于vue element el-form 多級嵌套驗(yàn)證的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)element el-form 多級嵌套驗(yàn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用命令行工具npm新創(chuàng)建一個(gè)vue項(xiàng)目的方法
Vue.js 提供一個(gè)官方命令行工具,可用于快速搭建大型單頁應(yīng)用。下面小編給大家分享使用命令行工具npm新創(chuàng)建一個(gè)vue項(xiàng)目的方法,需要的朋友參考下吧2017-12-12
講解vue-router之什么是動(dòng)態(tài)路由
這篇文章主要介紹了講解vue-router之什么是動(dòng)態(tài)路由,詳細(xì)的介紹了什么是動(dòng)態(tài)路由,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
Vue清除定時(shí)器setInterval優(yōu)化方案分享
這篇文章主要介紹了Vue清除定時(shí)器setInterval優(yōu)化方案分享,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07

