Element中使用表单验证

173 阅读1分钟

表单验证[2019.12.25]

  1. 父组件部分代码(例子)
<template>
...
    <el-form  :model="ruleForm" :rules="formRules" ref="ruleForm">
        <el-form-item prop="name" label="昵称">
            <el-input v-model="ruleForm.name"></el-input>
        </el-form-item>
        <el-form-item prop="email" label="邮箱" >
            <el-input v-model="ruleForm.email"></el-input>
        </el-form-item>
        <phone-set 
        	:phone="ruleForm.phone" 
        	@addPhone="addPhone" 
       		@deletePhone="deletePhone"
        ></phone-set>
   </el-form>
...
</template>
<script>
export default {
    import PhoneSet from "./phone";
    data(){
        let validateName = (rule,value,callback)=>{
            let reg = /[^a-zA-Z0-9_.\-\u4e00-\u9fa5]/;
            if(value){
                if(value.length > 50){
                        callback(new Error('最大长度为50个字符'));
                    }else if (reg.exec(value)) {
                        callback(new Error('包含非法字符(应由数字、字母、中文、_.-组成)'));
                    } else {
                        callback();
                    }
                }
            }
        return{
            ruleForm:{
                email: '',
                name: '',
                phone: [{tell:''}]
            }
            formRules:{
                email:[{ 
                        required: true, 
                        message: '请输入邮箱地址', 
                        trigger: 'blur' 
                    },{ 
                        type: 'email', 
                        message: '请输入正确的邮箱地址', 
                        trigger: ['blur', 'change']
                    }
                ],
                name:[{
                        require: true,
                        message: '请输入昵称', 
                        trigger: 'blur' 
                    },{
                        pattern:/[^a-zA-Z0-9_.\-\u4e00-\u9fa5]/, 
                        message: '包含非法字符(应由数字、字母、中文、_.-组成)',
                        trigger: ['blur', 'change']
                    },{
                        max:20, 
                        message: '最大长度为20个字符',
                        trigger: 'change'
                    },{ 
                        validator:validateName, 
                        trigger: ['blur', 'change']
                    }
                ]
            }
        }
    },
    methods:{
        //删除
        deletePhone(index) {
            this.ruleForm.phone.splice(index, 1)
        },
        //添加
        addPhone() {
            this.ruleForm.phone.push( { tell: "" } )
        },
    }
}
</script>   
  1. 子组件部分代码[phone.vue]
<template>
...
    <el-form-item  :label="电话" prop="phone" >
        <div v-for="(phoneItem,index) in phone" :key="index" >
            <el-form-item :prop="`phone.${index}.tell`" :rules="formRules.tell" >
                <el-input :placeholder="请输入电话号码" v-model="phoneItem.tell" ></el-input>
            </el-form-item>
            <div>
                <i class="el-icon-plus" @click="addPhone()"></i>
                <i class="el-icon-close" v-if="index!=0" @click="deletePhone(index)"></i>
            </div>
        </div>
    </el-form-item>
...
</template>
<script>
export default{
    props:{
        phone:{
            type:Array,
            require: true
        }
    }
    data(){
        return{
            formRules:{
                phone:[{required: true}],
                tell: [{required: true, message: "请输入电话号码", trigger: 'blur'}]
            }
        }
    },
    methods:{
        //添加
        addContions() {
            this.$emit('addPhone')
        },
        //减去
        deleteContions(index) {
            this.$emit('deletePhone', index)
        }
    }
}
</script>

  1. 【参考链接:async-validator