整體思路:
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"> </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('請填寫郵箱')); } }
。
