Element UI:Vue 實(shí)現(xiàn)前端表單依據(jù)下拉框動(dòng)態(tài)校驗(yàn)

真實(shí)開發(fā)場景:最近入職實(shí)習(xí),公司開發(fā)模塊有個(gè)簡單的需求:前端表單根據(jù)下拉選項(xiàng)的類別進(jìn)行校驗(yàn) ;并提示不同的校驗(yàn)信息。思考過后發(fā)現(xiàn)確實(shí)是常用的功能,如錄入的賬號(hào)可綁定郵箱、QQ、手機(jī)等不同信息時(shí)的校驗(yàn),這些都需要前端進(jìn)行動(dòng)態(tài)校驗(yàn),而不是后端處理

需求分析

  • 改變下拉框 選項(xiàng),前端校驗(yàn)對(duì)應(yīng)的類型是否滿足規(guī)則
  • 需要校驗(yàn)地址類型:IPv4,IPv6 和 域名 (效果圖如下)
效果圖1
效果圖2

實(shí)現(xiàn)思路

  • 在el-select 下拉框上綁定change 響應(yīng)事件,在選項(xiàng)內(nèi)容改變時(shí)觸發(fā)
  • 編寫change的回調(diào)函數(shù),serverAddrChanged(value),其中參數(shù)是下拉框雙向綁定的value值
  • 將表單校驗(yàn)規(guī)則聲明為全局屬性,通過prop屬性 和 value值動(dòng)態(tài)設(shè)置校驗(yàn)規(guī)則

核心代碼

前端下拉框,與規(guī)則聲明
<el-form :rules="rules1">
<!--.............-->
  <el-form-item label="地址類型:" prop="serverAddrType"> 
   <el-select class="wh200" @change="serverAddrChanged" v-model="serverForm.serverAddrType" placeholder="選擇地址類型" clearable="" filterable=""> 
      <!-- 此處選項(xiàng)是value 到 name 的一個(gè)映射(展現(xiàn)的是name,真實(shí)值為value)-->
    <el-option v-for="item in serverAddrType_opt" :key="item.codeValue" :label="item.codeName" :value="item.codeValue"></el-option> 
   </el-select> 
  </el-form-item>
    <el-form-item label="IP或域名:" prop="serverIp">
        <el-input v-model.trim="serverForm.serverIp" placeholder="請(qǐng)輸入IP或域名" ></el-input>
    </el-form-item>
</el-form>

<script>
  data(){
    return{
      // ....
      rules1: {}
    }
  }
</script>
類型修改后觸發(fā)函數(shù)
        // 地址類型下拉框 改變
        serverAddrChanged(value){
            //value === codeValue 改變鍵入規(guī)則
            this.rules1['serverIp'] = [];
            let pt = '';
            let msg = '';
            if(value === 2570001){
                // ipv4
                msg = '請(qǐng)輸入正確的IPv4地址';
                pt = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[09][0-9]|[1-9][0-9]|[0-9])$/;
            }else if(value === 2570002){
                msg = '請(qǐng)輸入正確的IPv6地址';
                pt = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/
            }else{
                msg = '請(qǐng)輸入正確的域名';
                pt = /^([H|h][T|t][T|t][P|p][S|s]?:\/\/)[^\s]+/;
            }
            this.rules1['serverIp'].push({required: true, message: msg, pattern: pt, trigger: "blur"});  
        }

注意事項(xiàng)(坑)

  • 每次編輯或添加服務(wù)時(shí),前端的校驗(yàn)值需清空(否則會(huì)記錄上次的錯(cuò)誤提示,用戶還沒操作就爆紅)
    實(shí)現(xiàn)很簡單,內(nèi)置的resetFields() 清空校驗(yàn)信息
            this.$nextTick(() => {
                this.$refs.serverForm.resetFields(); 
            });
  • 由于校驗(yàn)是在下拉框改變時(shí)觸發(fā)事件初始化的,所以在編輯某個(gè)服務(wù)時(shí)默認(rèn)狀態(tài)下無校驗(yàn),也就是說這時(shí)前端的校驗(yàn)就失效了,要做的就是在回顯數(shù)據(jù)的同時(shí),依靠當(dāng)前回顯的類型,初始化表單的校驗(yàn)規(guī)則
            // 下拉正則回顯
            this.serverAddrChanged(this.serverForm["serverAddrType"]);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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