element-ui做表單驗證 v-for遍歷表單 自動生成校驗規則 pc移動雙適配


整體思路:

1:利用element-ui的柵格實現小分辨率和大分辨率的適配

2:模擬一組數據,從中篩選出 綁定各個表單值的對象   以及生成驗證規則對象

3:在script標簽內 、data()外,自定義驗證規則,這樣在created鈎子中(也就是生成驗證對象時)就可以將這些自定義的規則加入進去

下面是整了一天的代碼:

<template>
    <div class="box1">
        <div style="margin-top:400px;"></div>

        <el-row>
            <el-col :xs="0" :md="3">&nbsp;</el-col> <el-col :xs="24" :md="18">
                <el-form label-width="100px" ref="formData" :model="formData" :rules="rules">
                    <div :index="(index+'')" v-for="(item,index) in arrList" :key="item.name">
                        <el-form-item v-if="item.name=='select'" :prop="item.name"  :label="item.name">
                            <el-select v-model.trim="formData[item.name]" 
                                        placeholder="請選擇活動區域" 
                                        @change="valChange" 
                                        style="width:100%;">
                                <el-option label="請選擇" value=""></el-option>
                                <el-option label="區域一" value="shanghai"></el-option>
                                <el-option label="區域二" value="beijing"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item  v-else-if="item.name=='textarea'" :prop="item.name"  :label="item.name">
                            <el-input type="textarea" v-model.trim="formData[item.name]" @change="valChange"></el-input>
                        </el-form-item>
                        <el-form-item  v-else :prop="item.name"  :label="item.name">
                            <el-input v-model.trim="formData[item.name]" @blur="valChange"></el-input>
                        </el-form-item>
                    </div>
                    <el-form-item style="text-align:center;">
                        <el-button type="primary" @click="submitForm('formData')">立即創建</el-button>
                        <el-button @click="resetForm('formData')">重置</el-button>
                    </el-form-item>
                </el-form>
            </el-col> </el-row>
                

        
    </div>
</template>

<script>
// import global from '@/js/global.js';
//自定義校驗規則(郵箱)
var checkEmail = (rule, value, callback) => {
    const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
    if (!value) {
        return callback(new Error('郵箱不能為空'));
    }
    setTimeout(() => {
        if (mailReg.test(value)) {
            callback()
        } else {
            callback(new Error('請輸入正確的郵箱格式'));
        }
    }, 100)
}
// 電話驗證
var checkPhone = (rule, value, callback) => {
    const phoneReg = /^1[3|4|5|7|8][0-9]{9}$/
    if (!value) {
        return callback(new Error('電話號碼不能為空哦也'))
    }
    setTimeout(() => {
        // Number.isInteger是es6驗證數字是否為整數的方法,但是我實際用的時候輸入的數字總是識別成字符串
        // 所以我就在前面加了一個+實現隱式轉換

        if (!Number.isInteger(+value)) {
            callback(new Error('請輸入數字值'))
        } else {
            if (phoneReg.test(value)) {
                callback()
            } else {
                callback(new Error('電話號碼格式不正確'))
            }
        }
    }, 100)
}
export default {
    components:{
    },
    data(){
        return {
            formData:{},//用於綁定各個表單值的對象
            arrList:[],//模擬一個初始化數據
            rules:{},//驗證規則對象
        }
    },
    created(){
        //模擬的假數據
        this.arrList=[
            {name:"a1",required:1},
            {name:"a2",required:0},
            {name:"select",required:1},
            {name:"email",required:1},
            {name:"phone",required:1},
            {name:"textarea",required:1},
        ]
        // 用於綁定各個表單值的對象
        for(let i=0,len=this.arrList.length;i<len;i++){
            var obj={[this.arrList[i].name]:""}
            this.formData=Object.assign({},this.formData,obj);
        }
        console.log(this.formData);
        // 生成校驗規則對象
        for(let i=0,len=this.arrList.length;i<len;i++){
            var arrs=[];
            if(this.arrList[i].required==1){
                var objs={
                        required: true, 
                        message: this.arrList[i].name+'不能為空', 
                        trigger: 'blur'
                    };
                if(this.arrList[i].name=='select'){
                    objs={
                        required: true, 
                        message: this.arrList[i].name+'不能為空', 
                        trigger: 'change'
                    }
                    arrs.push(objs);
                }else if(this.arrList[i].name=='email'){
                    arrs.push(objs);
                    objs={ validator: checkEmail, trigger: 'blur' };//自定義的驗證規則
                    arrs.push(objs);
                }else if(this.arrList[i].name=='phone'){
                    arrs.push(objs);
                    objs={ validator: checkPhone, trigger: 'blur' };//自定義的驗證規則
                    arrs.push(objs);
                }else if(this.arrList[i].name=='textarea'){
                    arrs.push(objs);
                    objs={ min: 5, max: 8, message: '長度在 5 到 8 個字符', trigger: 'blur' };//長度驗證
                    arrs.push(objs);
                }else{
                    arrs.push(objs);
                }
                
            }
            this.rules[this.arrList[i].name]=arrs;
        }
        console.log(this.rules)
    },
    mounted(){
        

    },
    methods:{
        //提交事件
        submitForm(formName) {
            this.$refs[formName].validate((valid) => {
                if (valid) {
                    alert('submit!');
                } else {
                    console.log('error submit!!');
                    return false;
                }
            });
        },
        // 重置事件
        resetForm(formName) {
            this.$refs[formName].resetFields();
        },
        // 每個表單的值改變的事件
        valChange(val){
            console.log(val)
            console.log(this.formData)
        }
    }
}
</script>

 增加一個表單驗證的正則:

function verifyEmail(email){
    var reg = new RegExp(/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/); //郵箱驗證
    if(reg.test(email)){
        return true;
    }else{
        return false;
    }
}

完整郵箱驗證:

var validUsername=(rule, value, callback)=>{
            var reg = new RegExp(/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/); //郵箱驗證
            
            if(value){
                if(reg.test(value)){
                    this.checkEmail(value).then((data=>{
                        if(data){
                            callback();
                        }else{
                            callback(new Error('郵箱已存在'));
                        }
                    }))
                }else{
                    callback(new Error('請輸入正確的郵箱地址'));
                }
            }else{
                callback(new Error('請填寫郵箱'));
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM