element-ui的form數(shù)組表單驗證(循環(huán)表單驗證)

基于vue2.0的element-ui的form表單驗證比較簡單,但是有些同學(xué)可能對于數(shù)組類型的表單驗證無從下手,這里我基于一個我自己項目中的例子,展示一下怎么進(jìn)行數(shù)組的表單驗證。

項目截圖:


image.png

上代碼,為了讓大家看起來比較清晰,我刪掉了無關(guān)的代碼:

<template>
<div class="create_send">
   <el-form ref="refForm" :model="formData" :rules="rules">
        <el-form-item label="選擇事件:" prop="eventCode">
            <el-select v-model="formData.eventCode" placeholder="請選擇">
                <el-option
                v-for="item in eventoptions"
                :key="item.value"
                :label="item.label"
                :value="item.value">
                </el-option>
            </el-select>
        </el-form-item>
    </el-form>
    <el-form  v-for="(item,index) in formData.ruleList" :ref="`refForm${index}`" :key="index" :model="item" :rules="rules">
        <el-form-item label="倒計時天數(shù):" prop="ruleString" class="err_position">
            <el-input v-model="item.ruleString" style="width:207px;float:left" placeholder="請輸入內(nèi)容"></el-input>
        </el-form-item>
    </el-form>
</div>
</template>
<script>
import { sysDictMoreType } from '@/api/neo/shareHouse'
export default {
    data(){
        return {
            formData:{
                eventCode:"",
                eventName:"",
                ruleList:[
                    {
                        ruleString:""
                    }
                ]
            },
            eventoptions:[],
            rules:{
                eventCode:[{required:true,message:"請選擇事件類型",trigger:"change"}],
                ruleString:[{required:true,message:"請?zhí)顚懙褂嫊r天數(shù)",trigger:"blur"}],
            }
        }
    },
    mounted(){
        this.getSelectData()
    },
    methods:{
        confirm(){
            Promise.all([
                this.validateForm("refForm"),
                ...this.formData.ruleList.map((item,index)=>this.validateForm(`refForm${index}`))
            ]).then(res=>{
                if(res) {
                    // 表單驗證通過
                }
            })
        },
        validateForm(refs){
            let valiForm = this.$refs?.[refs].validate?this.$refs?.[refs]:this.$refs?.[refs][0]
            return new Promise((resolve,reject)=>{
                valiForm.validate(res=>{
                    if(res) resolve()
                    else reject()
                })
            })
        },
        getSelectData(){//獲取下拉選擇框列表
            sysDictMoreType(["im_event_code"]).then(res=>{
                this.eventoptions = res?.data?.im_event_code||[]
            })
        },
        addEvent(){//新增一條發(fā)送時間
            this.formData.ruleList.push({
                ruleString:""
            })
        },
        deleteEvent(){//刪除一條發(fā)送時間,忽略},
    },
}
</script>
<style lang="scss">
//節(jié)省篇幅,刪掉了css
</style>

咱們把數(shù)組驗證的部分拿出來看:

<el-form  v-for="(item,index) in formData.ruleList"  :key="index" :model="item" :rules="rules">
     <el-form-item label="倒計時天數(shù):" prop="ruleString" class="err_position">
         <el-input v-model="item.ruleString" style="width:207px;float:left" placeholder="請輸入內(nèi)容"></el-input>
     </el-form-item>
 </el-form>

上邊代碼最關(guān)鍵的地方就是:

:ref="`refForm${index}`"

因為ref不能相同,咱們?nèi)〉絠ndex用來拼接不同的ref字符串。
然后在表單驗證的時候就可以循環(huán)的進(jìn)行獲取refs并驗證了,下面這倆函數(shù)大家可以直接復(fù)制一下拿去用,保證有用:

confirm(){
     //用Promise.all進(jìn)行全部form表單的驗證
     Promise.all([
         //非數(shù)組部分的表單
         this.validateForm("refForm"),
         //數(shù)組部分的表單,用map返回驗證函數(shù)的調(diào)用
         ...this.formData.ruleList.map((item,index)=>this.validateForm(`refForm${index}`))
     ]).then(res=>{
         if(res) {
             // 全部表單驗證通過
         }
     })
 },
 validateForm(refs){
      //獲取到form表單的dom,如果是對象直接拿到,如果是數(shù)組,就拿第一個
      //elementui對循環(huán)的form包裝成了數(shù)組
     let valiForm = this.$refs?.[refs].validate?this.$refs?.[refs]:this.$refs?.[refs][0]
     return new Promise((resolve,reject)=>{
         //在Promise里進(jìn)行驗證,如果通過就resolve()
         valiForm.validate(res=>{
             if(res) resolve()
             else reject()
         })
     })
 },
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容