這是我參與更文挑戰的第2天,活動詳情查看: 更文挑戰後端
項目中常常會出現的表單驗證環節,通常是一個表單,提交時驗證一波就能夠了,不免遇到業務繁雜的時候,一個表單不能知足需求了,就須要設置多個表單,驗證方式也須要稍做調整了數組
validate()
markdown
// 以此表單爲例
// 在表單設置ref,rules
<template>
<el-form
ref="createForm"
:model="createTask"
:rules="rules"
label-width="120px"
>
// 這裏設置prop,model
<el-form-item
label="名稱"
prop="task_name"
>
<el-input
v-model="createTask.task_name"
placeholder="請輸入名稱"
></el-input>
</el-form-item>
...
</el-form>
</template>
<script>
// 其餘項省略嘍
data() {
return {
createTask:{
task_name: '',
...
},
rules: {
task_name: [
{ required: true, message: '請輸入名稱', trigger: 'blur' },
{ min: 5, max: 22, message: '長度在 5 到 22 個字符', trigger: 'blur' }
//其餘驗證設置...
],
...
}
}
},
methods: {
// 在須要的地方驗證createForm表單
xxxFn(){
// valid
this.$refs.createForm.validate((valid) => {
if (valid) {
// submit Fn
} else {
// error
}
})
},
// 或者這樣
async xxxFn() {
try {
// valid
await this.$refs.createForm.validate()
// submit API
await submit({params})
// success
} catch (error) {
// error
}
}
}
</script>
複製代碼
validateField()
async
根據上面的示例改個方法便可post
this.$refs.createForm.validateField('task_name')
複製代碼
驗證多個字段,傳入數組ui
this.$refs.createForm.validateField(['task_name','xxx',...])
複製代碼
clearValidate()
this
this.$refs.createForm.clearValidate()
複製代碼
須要和resetFields()
區分一下,clearValidate() 是去掉了驗證效果,僞裝沒有驗證過,resetFields() 是對整個表單進行重置,將全部字段值重置爲初始值,並去掉驗證效果,回到表單最初始的狀態spa
clear方法不變,直接傳參code
this.$refs.createForm.clearValidate('task_name')
複製代碼
一樣,清除多個字段字段驗證,傳入數組便可orm
this.$refs.createForm.clearValidate(['task_name','xxx',...])
複製代碼
data() {
//在這裏定義條件判斷
let checkName = (rule, value, callback) => {
if (value === '') {
callback(new Error('不能爲空'))
} else if (value !== 'default') {
callback(new Error('默認值'))
} else {
callback()
}
}
return {
rules: {
// 在這裏設置 validator
task_name: [
{ required: true, validator: checkName , trigger: 'blur' }
// 這裏也能夠加其餘驗證
]
}
}
}
複製代碼
data() {
let checkName = (rule, value, callback) => {
if (value === '') {
callback(new Error('不能爲空'))
} else if (value !== 'default') {
callback(new Error('默認值'))
} else {
let result = this.checkTaskNameFn(value)
result
.then((data) => {
if (data) {
callback()
} else {
callback(new Error('驗證不知足..'))
}
})
.catch((res) => {
callback(new Error('error 不知足')))
})
}
}
// rules同上
}
methods: {
checkTaskNameFn(value) {
return new Promise(async (resolve, reject) => {
try {
await checkAPI({params})
resolve(true)
} catch (error) {
reject(false)
}
})
}
}
複製代碼
rules: {
task_name: [
{ required: true, message: '請輸入名稱', trigger: 'blur' },
{
pattern: /(?!^[0-9]+$)(?!^[A-z]+$)(?!^[^A-z0-9]+$)^.{6,20}$/,
message: '格式不正確'
}
]
}
複製代碼
當遇到正則和其餘條件一塊兒驗證等繁瑣需求,rules設置也不能徹底知足需求,也可使用自定義條件
此處分享一則我遇到的 並不常見的 亂七八糟的 正則驗證需求,體驗一下:
8-16位字符,須要同時包括數字、大小寫字母和特殊字符,其中特殊字符最多不能超過3個,且須要在「~ @ # $ % * _ - + = : , . ? [ ] { }」範圍內
data() {
let checkName = (rule, value, callback) => {
let sRegex = '^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[~@#$%*+=:,?._\-{}\[\]])[\da-zA-Z~@#$%*+=:,?._\-{}\[\]]{8,16}$'
let num = value.replace(/[^~@#$%*+=:,?._\-{}\[\]]/g, '').length
let reg = new RegExp(sRegex)
if (!value) {
callback(new Error('不能爲空'))
} else if (!reg.test(value)) {
callback(new Error('不知足'))
} else if (num > 3) {
callback(new Error('特殊字符不能超過3個'))
} else { // 其餘條件
// 或組合API驗證...
callback()
}
}
}
複製代碼
示例兩個表單
<el-form
ref="formA"
:model="modelA"
:rules="rulesA"
></el-form>
<el-form
ref="formB"
:model="modelB"
:rules="rulesB"
></el-form>
複製代碼
驗證條件隨意,驗證方法以下:
// 先定義個方法
methods:{
async validateAllform() {
// 這樣
let formA
this.$refs.formA.validate((valid) => {
if (valid) {
formA = valid
...
}else{
...
}
})
// 這樣
let formB = this.$refs.formB.validate()
// 或這樣 (form中可能有API驗證)
let formA = await this.$refs.formA.validate()
let formB = await this.$refs.formB.validate()
// 根據需求整點兒邏輯判斷
if (formA && formB) {
return true
} else {
return false
}
},
// 在須要的地方調用便可
async handleNext() {
try {
// valid
let isValid = await this.validateAllform()
// true && submit
} catch (error) {
// error
}
}
}
複製代碼
以上就是被各類需求捶打的我在項目中親測並使用的一些驗證姿式,根據各自項目的具體需求一塊兒CV吧~~