Vue Element-ui表單校驗
- Vue Element-ui表單校驗
- 基本校驗方法
- rules中直接配置的具體參數
- 遇到的坑
- 網絡上其他校驗規則
- 1、是否合法IP地址
- 2、是否手機號碼或者固話
- 3、是否固話
- 4、是否手機號碼
- 5、是否身份證號碼
- 6、是否郵箱
- 7、合法url
- 8、驗證內容是否包含英文數字以及下划線
- 9、自動檢驗數值的范圍
- 10、驗證數字輸入框最大數值
- 11、驗證是否1-99之間
- 12、驗證是否整數
- 13、驗證是否整數,非必填
- 14、 驗證是否是[0-1]的小數
- 15、 驗證是否是[1-10]的小數,即不可以等於0
- 16、驗證是否是[1-100]的小數,即不可以等於0
- 17、驗證是否是[0-100]的小數
- 18、驗證端口是否在[0,65535]之間
- 19、驗證端口是否在[0,65535]之間,非必填,isMust表示是否必填
- 20、小寫字母
- 22、兩位小數驗證
- 23、是否大寫字母
- 24、是否大小寫字母
- 25、密碼校驗
- 26、中文校驗
- 27、身份證校驗
- 28、 賬號校驗
- 29 、純數字校驗
- 30、最多一位小數
基本校驗方法
vue,element-ui表單校驗中通常采用rules進行配置,下文為一個element-ui官方給出的例子,通過為el-form配置rules並且針對對應參數編寫校驗規則即可,如果不采用這種方式,也可以對於字段直接采用oninput="value=value.replace(正則,"替換")"的方式進行輸入的強制規范,當然更推薦前一種,對用戶更加友好
注意el-form-item 的prop屬性一定需要完全對應rules中的某個屬性,同時也要和v-model中的對應
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
<el-form-item label="活動名稱" prop="name">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label="活動區域" prop="region">
<el-select v-model="ruleForm.region" placeholder="請選擇活動區域">
<el-option label="區域一" value="shanghai"></el-option>
<el-option label="區域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="活動時間" required>
<el-col :span="11">
<el-form-item prop="date1">
<el-date-picker type="date" placeholder="選擇日期" v-model="ruleForm.date1" style="width: 100%;"></el-date-picker>
</el-form-item>
</el-col>
<el-col class="line" :span="2">-</el-col>
<el-col :span="11">
<el-form-item prop="date2">
<el-time-picker placeholder="選擇時間" v-model="ruleForm.date2" style="width: 100%;"></el-time-picker>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="即時配送" prop="delivery">
<el-switch v-model="ruleForm.delivery"></el-switch>
</el-form-item>
<el-form-item label="活動性質" prop="type">
<el-checkbox-group v-model="ruleForm.type">
<el-checkbox label="美食/餐廳線上活動" name="type"></el-checkbox>
<el-checkbox label="地推活動" name="type"></el-checkbox>
<el-checkbox label="線下主題活動" name="type"></el-checkbox>
<el-checkbox label="單純品牌曝光" name="type"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="特殊資源" prop="resource">
<el-radio-group v-model="ruleForm.resource">
<el-radio label="線上品牌商贊助"></el-radio>
<el-radio label="線下場地免費"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="活動形式" prop="desc">
<el-input type="textarea" v-model="ruleForm.desc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">立即創建</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
<script>
export default {
data() {
return {
ruleForm: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: ''
},
rules: {
name: [
{ required: true, message: '請輸入活動名稱', trigger: 'blur' },
{ min: 3, max: 5, message: '長度在 3 到 5 個字符', trigger: 'blur' }
],
region: [
{ required: true, message: '請選擇活動區域', trigger: 'change' }
],
date1: [
{ type: 'date', required: true, message: '請選擇日期', trigger: 'change' }
],
date2: [
{ type: 'date', required: true, message: '請選擇時間', trigger: 'change' }
],
type: [
{ type: 'array', required: true, message: '請至少選擇一個活動性質', trigger: 'change' }
],
resource: [
{ required: true, message: '請選擇活動資源', trigger: 'change' }
],
desc: [
{ required: true, message: '請填寫活動形式', trigger: 'blur' }
]
}
};
},
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();
}
}
}
</script>
rules中直接配置的具體參數
目前接觸下來有max,min,pattern,type,required,validator等,需要注意表單原始輸入均為字符串,因此max和min指的是字符串長度,pattern為根據正則進行判斷,type直接指定類型,required必填不再贅述,validator為自定義驗證規則,其他部分len為指定確切長度(與min、max一起使用時len優先),whitespace驗證是否只有空格,transform為某些時刻在驗證之前轉換輸入提供的函數,使用方法如下:
transform: [
{type: 'enum', enum: [2,4,6], message: `結果不存在`, trigger: ['change', 'blur'], transform(value) {return Number(value * 2)}}
]
message為校驗不通過時的提示,asyncValidator為自定義異步驗證功能
rules中type的可識別的類型值如下:string、number、bollean、integer、float、array、enum、url等
string
:類型必須為string
。type
默認是 `string
// 校驗
string: [
{type: 'string', message: `請輸入字符串`, trigger: 'blur'}
]
<el-form-item label="測試字段" prop="string">
<el-input v-model.number="form.string" placeholder="請輸入"></el-input>
</el-form-item>
number
:類型必須為number
。
// 校驗
number: [
{type: 'number', message: `請輸入數字`, trigger: 'blur'}
]
<el-form-item label="測試字段" prop="number">
<el-input v-model="form.number" placeholder="請輸入"></el-input>
</el-form-item>
boolean
:類型必須為boolean
。
// 校驗
boolean: [
{type: 'boolean', message: `請輸入數字`, trigger: 'change'}
]
<el-form-item label="測試字段" prop="boolean">
<el-select v-model="form.boolean" placeholder="請選擇">
<el-option label="true" :value="true"></el-option>
<el-option label="false" :value="false"></el-option>
<el-option label="字符串" :value="'zifuchuan'"></el-option>
</el-select>
</el-form-item>
integer
:類型必須為number
且為整數。
// 校驗
integer: [
{type: 'integer', message: `請輸入整數`, trigger: 'blur'}
]
float
:類型必須為number
且為浮點數。
// 校驗
float: [
{type: 'float', message: `請輸入浮點數`, trigger: 'blur'}
]
array
:類型必須為數組
// 校驗
array: [
{type: 'array', message: `請選擇數組`, trigger: 'change'}
]
<el-form-item label="測試字段" prop="array">
<el-select v-model="form.array" placeholder="請選擇">
<el-option label="數組" :value="[1,2,3]"></el-option>
<el-option label="false" :value="false"></el-option>
<el-option label="字符串" :value="'zifuchuan'"></el-option>
</el-select>
</el-form-item>
enum
:值必須存在於中enum
// 校驗
enum: [
{type: 'enum', enum: ['aaa', 'bbb'], message: `不存在enum中`, trigger: 'change'}
]
url
:類型必須為url
// 校驗
url: [
{type: 'url', message: `請輸入正確的url`, trigger: 'change'}
]
email
:類型必須為email
method
:類型必須為function
regexp
:必須是RegExp
創建新時不會產生異常的的實例或字符串RegExp
。object
:類型必須為object
date
:類型必須為date
hex
:類型必須為hex
any
:任何類型
遇到的坑
需求為對經緯度進行校驗,本來想着直接通過type:float處理,后來發現校驗怎么都通不過,后來發現表單直接輸入的時候是字符串,沒法進行這個規則處理,需要在前面el-form-item的內部表單的v-model屬性后面加上.number,比如
<el-form-item label="" prop="latitude">
<el-input v-model.number="form.latitude" type="" placeholder=""/>
</el-form-item>
但是這個方式有一個問題,經過v-model.number處理后表單中是沒有辦法輸入小數點的,只能輸入整數,所以就變得非常難辦,只能采用自定義規則去處理,規則如下
在使用自定義規則的時候需要注意,自定義規則寫在data()里但不是data(){return{}}里,這點非常關鍵,同時自定義規則中除了所有錯誤,最后一定要加上一個callback(),否則回調無法正常進行,以下為官方的一個自定義驗證規則例子
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
<el-form-item label="密碼" prop="pass">
<el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="確認密碼" prop="checkPass">
<el-input type="password" v-model="ruleForm.checkPass" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="年齡" prop="age">
<el-input v-model.number="ruleForm.age"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
<script>
export default {
data() {
//函數都寫在data()中而不是return中
var checkAge = (rule, value, callback) => {
if (!value) {
return callback(new Error('年齡不能為空'));
}
setTimeout(() => {
if (!Number.isInteger(value)) {
callback(new Error('請輸入數字值'));
} else {
if (value < 18) {
callback(new Error('必須年滿18歲'));
} else {
callback();//最關鍵的一個callback
}
}
}, 1000);
};
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('請輸入密碼'));
} else {
if (this.ruleForm.checkPass !== '') {
this.$refs.ruleForm.validateField('checkPass');
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('請再次輸入密碼'));
} else if (value !== this.ruleForm.pass) {
callback(new Error('兩次輸入密碼不一致!'));
} else {
callback();
}
};
return {
ruleForm: {
pass: '',
checkPass: '',
age: ''
},
rules: {
pass: [
{ validator: validatePass, trigger: 'blur' }
],
checkPass: [
{ validator: validatePass2, trigger: 'blur' }
],
age: [
{ validator: checkAge, trigger: 'blur' }
]
}
};
},
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();
}
}
}
</script>
網絡上其他校驗規則
1、是否合法IP地址
export function validateIP(rule, value,callback) {
if(value==''||value==undefined||value==null){
callback();
}else {
const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
if ((!reg.test(value)) && value != '') {
callback(new Error('請輸入正確的IP地址'));
} else {
callback();
}
}
}
2、是否手機號碼或者固話
export function validatePhoneTwo(rule, value, callback) {
const reg = /^((0\d{2,3}-\d{7,8})|(1[34578]\d{9}))$/;;
if (value == '' || value == undefined || value == null) {
callback();
} else {
if ((!reg.test(value)) && value != '') {
callback(new Error('請輸入正確的電話號碼或者固話號碼'));
} else {
callback();
}
}
}
3、是否固話
export function validateTelphone(rule, value,callback) {
const reg =/0\d{2,3}-\d{7,8}/;
if(value==''||value==undefined||value==null){
callback();
}else {
if ((!reg.test(value)) && value != '') {
callback(new Error('請輸入正確的固定電話)'));
} else {
callback();
}
}
}
4、是否手機號碼
export function validatePhone(rule, value,callback) {
const reg =/^[1][3-9][0-9]{9}$/;
if(value==''||value==undefined||value==null){
callback();
}else {
if ((!reg.test(value)) && value != '') {
callback(new Error('請輸入正確的電話號碼'));
} else {
callback();
}
}
}
5、是否身份證號碼
export function validateIdNo(rule, value,callback) {
const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
if(value==''||value==undefined||value==null){
callback();
}else {
if ((!reg.test(value)) && value != '') {
callback(new Error('請輸入正確的身份證號碼'));
} else {
callback();
}
}
}
6、是否郵箱
export function validateEMail(rule, value,callback) {
const reg =/^([a-zA-Z0-9]+[-_\.]?)+@[a-zA-Z0-9]+\.[a-z]+$/;
if(value==''||value==undefined||value==null){
callback();
}else{
if (!reg.test(value)){
callback(new Error('請輸入正確的郵箱'));
} else {
callback();
}
}
}
7、合法url
export function validateURL(url) {
const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
return urlregex.test(url);
}
8、驗證內容是否包含英文數字以及下划線
export function isPassword(rule, value, callback) {
const reg =/^[_a-zA-Z0-9]+$/;
if(value==''||value==undefined||value==null){
callback();
} else {
if (!reg.test(value)){
callback(new Error('僅由英文字母,數字以及下划線組成'));
} else {
callback();
}
}
}
9、自動檢驗數值的范圍
export function checkMax20000(rule, value, callback) {
if (value == '' || value == undefined || value == null) {
callback();
} else if (!Number(value)) {
callback(new Error('請輸入[1,20000]之間的數字'));
} else if (value < 1 || value > 20000) {
callback(new Error('請輸入[1,20000]之間的數字'));
} else {
callback();
}
}
10、驗證數字輸入框最大數值
export function checkMaxVal(rule, value,callback) {
if (value < 0 || value > 最大值) {
callback(new Error('請輸入[0,最大值]之間的數字'));
} else {
callback();
}
}
11、驗證是否1-99之間
export function isOneToNinetyNine(rule, value, callback) {
if (!value) {
return callback(new Error('輸入不可以為空'));
}
setTimeout(() => {
if (!Number(value)) {
callback(new Error('請輸入正整數'));
} else {
const re = /^[1-9][0-9]{0,1}$/;
const rsCheck = re.test(value);
if (!rsCheck) {
callback(new Error('請輸入正整數,值為【1,99】'));
} else {
callback();
}
}
}, 0);
}
12、驗證是否整數
export function isInteger(rule, value, callback) {
if (!value) {
return callback(new Error('輸入不可以為空'));
}
setTimeout(() => {
if (!Number(value)) {
callback(new Error('請輸入正整數'));
} else {
const re = /^[0-9]*[1-9][0-9]*$/;
const rsCheck = re.test(value);
if (!rsCheck) {
callback(new Error('請輸入正整數'));
} else {
callback();
}
}
}, 0);
}
13、驗證是否整數,非必填
export function isIntegerNotMust(rule, value, callback) {
if (!value) {
callback();
}
setTimeout(() => {
if (!Number(value)) {
callback(new Error('請輸入正整數'));
} else {
const re = /^[0-9]*[1-9][0-9]*$/;
const rsCheck = re.test(value);
if (!rsCheck) {
callback(new Error('請輸入正整數'));
} else {
callback();
}
}
}, 1000);
}
14、 驗證是否是[0-1]的小數
export function isDecimal(rule, value, callback) {
if (!value) {
return callback(new Error('輸入不可以為空'));
}
setTimeout(() => {
if (!Number(value)) {
callback(new Error('請輸入[0,1]之間的數字'));
} else {
if (value < 0 || value > 1) {
callback(new Error('請輸入[0,1]之間的數字'));
} else {
callback();
}
}
}, 100);
}
15、 驗證是否是[1-10]的小數,即不可以等於0
export function isBtnOneToTen(rule, value, callback) {
if (typeof value == 'undefined') {
return callback(new Error('輸入不可以為空'));
}
setTimeout(() => {
if (!Number(value)) {
callback(new Error('請輸入正整數,值為[1,10]'));
} else {
if (!(value == '1' || value == '2' || value == '3' || value == '4' || value == '5' || value == '6' || value == '7' || value == '8' || value == '9' || value == '10')) {
callback(new Error('請輸入正整數,值為[1,10]'));
} else {
callback();
}
}
}, 100);
}
16、驗證是否是[1-100]的小數,即不可以等於0
export function isBtnOneToHundred(rule, value, callback) {
if (!value) {
return callback(new Error('輸入不可以為空'));
}
setTimeout(() => {
if (!Number(value)) {
callback(new Error('請輸入整數,值為[1,100]'));
} else {
if (value < 1 || value > 100) {
callback(new Error('請輸入整數,值為[1,100]'));
} else {
callback();
}
}
}, 100);
}
17、驗證是否是[0-100]的小數
export function isBtnZeroToHundred(rule, value, callback) {
if (!value) {
return callback(new Error('輸入不可以為空'));
}
setTimeout(() => {
if (!Number(value)) {
callback(new Error('請輸入[1,100]之間的數字'));
} else {
if (value < 0 || value > 100) {
callback(new Error('請輸入[1,100]之間的數字'));
} else {
callback();
}
}
}, 100);
}
18、驗證端口是否在[0,65535]之間
export function isPort(rule, value, callback) {
if (!value) {
return callback(new Error('輸入不可以為空'));
}
setTimeout(() => {
if (value == '' || typeof(value) == undefined) {
callback(new Error('請輸入端口值'));
} else {
const re = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
const rsCheck = re.test(value);
if (!rsCheck) {
callback(new Error('請輸入在[0-65535]之間的端口值'));
} else {
callback();
}
}
}, 100);
}
19、驗證端口是否在[0,65535]之間,非必填,isMust表示是否必填
export function isCheckPort(rule, value, callback) {
if (!value) {
callback();
}
setTimeout(() => {
if (value == '' || typeof(value) == undefined) {
//callback(new Error('請輸入端口值'));
} else {
const re = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
const rsCheck = re.test(value);
if (!rsCheck) {
callback(new Error('請輸入在[0-65535]之間的端口值'));
} else {
callback();
}
}
}, 100);
}
20、小寫字母
export function validateLowerCase(val) {
const reg = /^[a-z]+$/;
return reg.test(val);
}
22、兩位小數驗證
const validateValidity = (rule, value, callback) => {
if (!/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(value)) {
callback(new Error('最多兩位小數!!!'));
} else {
callback();
}
};
23、是否大寫字母
export function validateUpperCase(val) {
const reg = /^[A-Z]+$/;
return reg.test(val);
}
24、是否大小寫字母
export function validatAlphabets(val) {
const reg = /^[A-Za-z]+$/;
return reg.test(val);
}
25、密碼校驗
export const validatePsdReg = (rule, value, callback) => {
if (!value) {
return callback(new Error('請輸入密碼'))
}
if (!/^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$)([^\u4e00-\u9fa5\s]){6,20}$/.test(value)) {
callback(new Error('請輸入6-20位英文字母、數字或者符號(除空格),且字母、數字和標點符號至少包含兩種'))
} else {
callback()
}
}
26、中文校驗
export const validateContacts = (rule, value, callback) => {
if (!value) {
return callback(new Error('請輸入中文'))
}
if (!/^[\u0391-\uFFE5A-Za-z]+$/.test(value)) {
callback(new Error('不可輸入特殊字符'))
} else {
callback()
}
}
27、身份證校驗
export const ID = (rule, value, callback) => {
if (!value) {
return callback(new Error('身份證不能為空'))
}
if (! /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(value)) {
callback(new Error('請輸入正確的二代身份證號碼'))
} else {
callback()
}
}
28、 賬號校驗
export const validateCode = (rule, value, callback) => {
if (!value) {
return callback(new Error('請輸入賬號'))
}
if (!/^(?![0-9]*$)(?![a-zA-Z]*$)[a-zA-Z0-9]{6,20}$/.test(value)) {
callback(new Error('賬號必須為6-20位字母和數字組合'))
} else {
callback()
}
}
29 、純數字校驗
export const validateNumber = (rule, value, callback) => {
let numberReg = /^\d+$|^\d+[.]?\d+$/
if (value !== '') {
if (!numberReg.test(value)) {
callback(new Error('請輸入數字'))
} else {
callback()
}
} else {
callback(new Error('請輸入值'))
}
}
30、最多一位小數
const onePoint = (rule, value, callback) => {
if (!/^[0-9]+([.]{1}[0-9]{1})?$/.test(value)) {
callback(new Error('最多一位小數!!!'));
} else {
callback();
}
};