手把手教你uniapp和uview2.0實(shí)現(xiàn)表單校驗(yàn)實(shí)戰(zhàn)
表單提交是很常見的功能,本文基于uniapp+uview2.0實(shí)現(xiàn)表單常見屬性校驗(yàn)處理,使用到組件有u–form、Form-item,基本使用說明如下:
u–form
此組件一般是用于表單驗(yàn)證使用,每一個(gè)表單域由一個(gè)u-form-item組成,表單域中可以放置u-input、u-checkbox、u-radio、u-switch等。
在表單組中,通過model參數(shù)綁定一個(gè)對象,這個(gè)對象的屬性為各個(gè)u-form-item內(nèi)組件的對應(yīng)變量。
由于表單驗(yàn)證和綁定表單規(guī)則時(shí),需要通過ref操作,故這里需要給form組件聲明ref="form1"屬性。
關(guān)于u-from-item內(nèi)其他可能包含的諸如input、radio等組件,請見各自組件的相關(guān)文檔說明。
u-form-item
此組件一般需要搭配Form組件使用,也可以單獨(dú)搭配Input等組件使用,由于此組件參數(shù)較多,這里只對其中參數(shù)最簡要介紹,其余請見底部的API說明:
prop為傳入Form組件的model中的屬性字段,如果需要表單驗(yàn)證,此屬性是必填的。
labelPosition可以配置左側(cè)"label"的對齊方式,可選為left和top。
borderBottom是否顯示表單域的下劃線,如果給Input組件配置了邊框,可以將此屬性設(shè)置為false,從而隱藏默認(rèn)的下劃線。
如果想在表單域配置左右的圖標(biāo)或小圖片,可以通過leftIcon和rightIcon參數(shù)實(shí)現(xiàn)。
下面結(jié)合簡單的demo介紹一下基本使用,現(xiàn)在有一個(gè)用戶信息表單信息,包含基本的用戶昵稱、頭像、生日、簡介信息,現(xiàn)在需要對各字段進(jìn)行校驗(yàn)。點(diǎn)擊提交時(shí)都為空時(shí)的異常提示信息如下圖:

代碼內(nèi)容:
<template>
<view>
<!-- 注意,如果需要兼容微信小程序,最好通過setRules方法設(shè)置rules規(guī)則 -->
<u--form labelPosition="left" :model="model1" :rules="rules" ref="form1">
<u-form-item label="昵稱" prop="userInfo.userName" borderBottom ref="item1">
<u--input v-model="model1.userInfo.userName" border="none"></u--input>
</u-form-item>
<u-form-item label="頭像" prop="userInfo.userImg" borderBottom ref="item1">
<u-avatar :src="model1.userInfo.userImg" shape="circle" v-model="model1.userInfo.userImg"
@click="chooseTheImg()"></u-avatar>
</u-form-item>
<u-form-item label="性別" prop="userInfo.gender" borderBottom @click="showGender = true; hideKeyboard()"
ref="item1">
<u--input v-model="model1.userInfo.gender" disabled disabledColor="#ffffff" placeholder="請選擇性別"
border="none"></u--input>
<u-icon slot="right" name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="生日" prop="userInfo.birthday" borderBottom @click="showBirthday = true; hideKeyboard()"
ref="item1">
<u--input v-model="model1.userInfo.birthday" disabled disabledColor="#ffffff" placeholder="請選擇生日"
border="none"></u--input>
<u-icon slot="right" name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="簡介" prop="userInfo.intro" borderBottom ref="item3">
<u--textarea placeholder="不低于3個(gè)字" v-model="model1.userInfo.intro" count></u--textarea>
</u-form-item>
</u--form>
<u-button @click="submit">提交</u-button>
<u-action-sheet :show="showGender" :actions="actions" title="請選擇性別" description="如果選擇保密會報(bào)錯(cuò)"
@close="showGender = false;genderClose()" @select="genderSelect()">
</u-action-sheet>
<u-datetime-picker :show="showBirthday" :value="birthday" mode="date" closeOnClickOverlay
@confirm="birthdayConfirm" @cancel="birthdayClose" @close="birthdayClose"></u-datetime-picker>
</view>
</template>
<script>
export default {
data() {
return {
showGender: false, // 是否顯示性別選擇
showBirthday: false, // 是否展示生日選擇
model1: {
userInfo: {
userName: 'uView UI',
gender: '',
userImg: '/static/logo.png',
birthday: '',
intro: '',
}
},
actions: [{
name: '男',
},
{
name: '女',
},
{
name: '保密',
}
],
rules: {
'userInfo.userName': {
type: 'string',
required: true,
message: '請?zhí)顚戧欠Q',
trigger: ['blur', 'change']
},
'userInfo.gender': {
type: 'string',
max: 1,
required: true,
message: '請選擇男或女',
trigger: ['blur', 'change']
},
'userInfo.userImg': {
type: 'string',
required: true,
message: '請上傳頭像',
trigger: ['blur', 'change']
},
'userInfo.birthday': {
type: 'string',
required: true,
message: '請選擇生日',
trigger: ['change']
},
'userInfo.intro': {
type: 'string',
required: true,
message: '請?zhí)顚懞喗?,
trigger: ['change']
}
},
radio: '',
switchVal: false
};
},
methods: {
// 隱藏鍵盤
hideKeyboard() {
uni.hideKeyboard()
},
//選擇圖片
chooseTheImg() {
uni.chooseImage({
count: 1, //圖片可選擇數(shù)量
sizeType: ['original', 'compressed'], //original 原圖,compressed 壓縮圖,默認(rèn)二者都有
sourceType: ['album', 'camera', '海報(bào)圖庫'], //album 從相冊選圖,camera 使用相機(jī),默認(rèn)二者都有。
success: res => {
let imgFiles = res.tempFilePaths //圖片的本地文件路徑列表
console.log('本地地址', imgFiles)
this.uploadTheImg(imgFiles)
}
})
},
//上傳圖片
uploadTheImg(imgFiles) {
uni.uploadFile({
url: `XXXXXX`, //后端用于處理圖片并返回圖片地址的接口
header: {
"Content-Type": "multipart/form-data", // formdata提交格式
},
filePath: imgFiles[0],
name: 'uploadfile', // 默認(rèn)
formData: { // 其他的formdata參數(shù)
fileType: '2',
uid: '10001',
fileContainerName: 'default'
},
success: res => {
let data = JSON.parse(res.data) //返回的是字符串,需要轉(zhuǎn)成對象格式,打印data如下圖
if (data.code == 200) {
console.log(data.msg) //圖片地址
}
},
fail: () => {}
})
},
// 顯示性別列表并校驗(yàn)性別是否為那女
genderSelect(e) {
this.model1.userInfo.gender = e.name
this.$refs.form1.validateField('userInfo.gender')
// 校驗(yàn)頭像是否上傳
// this.$refs.form1.validateField('userInfo.userImg')
},
// 性別選擇關(guān)閉,校驗(yàn)是否選擇性別
genderClose() {
this.$refs.form1.validateField('userInfo.gender')
},
// 生日選擇關(guān)閉時(shí)校驗(yàn)生日格式以及是否為空
birthdayConfirm(e) {
this.showBirthday = false
this.model1.userInfo.birthday = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
this.$refs.form1.validateField('userInfo.birthday')
},
// 生日列表關(guān)閉時(shí)校驗(yàn)是否為空
birthdayClose() {
this.showBirthday = false
this.$refs.form1.validateField('userInfo.birthday')
},
submit() {
this.$refs.form1.validate().then(res => {
console.log("提交表單信息:" + JSON.stringify(this.model1.userInfo))
// uni.$u.toast('校驗(yàn)通過')
// 調(diào)用服務(wù)端入表接口
}).catch(errors => {
console.log("失敗信息:" + JSON.stringify(errors))
// uni.$u.toast('校驗(yàn)失敗')
})
}
},
onReady() {
//如果需要兼容微信小程序,并且校驗(yàn)規(guī)則中含有方法等,只能通過setRules方法設(shè)置規(guī)則。
this.$refs.form1.setRules(this.rules)
}
};
</script>
<style lang="scss">
</style>
規(guī)則說明:
校驗(yàn)規(guī)則需要從u--form組件中指定規(guī)則名,此處為rules,data屬性中rules用于定義表單各個(gè)屬性的校驗(yàn)內(nèi)容如下:
trigger{String | Array}:觸發(fā)校驗(yàn)的方式有2種:
change:字段值發(fā)生變化時(shí)校驗(yàn) blur:輸入框失去焦點(diǎn)時(shí)觸發(fā) 如果同時(shí)監(jiān)聽兩種方式,需要寫成數(shù)組形式:[‘change’,
‘blur’] type{String}
內(nèi)置校驗(yàn)規(guī)則,如這些規(guī)則無法滿足需求,可以使用正則匹配、或者使用validator自定義方法并結(jié)合uView自帶驗(yàn)證規(guī)則。string:必須是 string 類型,默認(rèn)類型 number:必須是 number 類型 boolean:必須是 boolean 類型
method:必須是 function 類型 regexp:必須是 regexp
類型,這里的正則,指的是判斷字段的內(nèi)容是否一個(gè)正則表達(dá)式,而不是用這個(gè)正則去匹配字段值 integer:必須是整數(shù)類型
float:必須是浮點(diǎn)數(shù)類型 array:必須是 array 類型 object:必須是 object 類型 enum:必須出現(xiàn)在 enmu
指定的值中 date:必須是 date 類型 url:必須是 url 類型 hex:必須是 16 進(jìn)制類型 email:必須是 email
類型 any:任意類型 required
布爾值,是否必填,配置此參數(shù)不會顯示輸入框左邊的必填星號,如需要,請配置u-form-item的required為true,注意:如需在swiper標(biāo)簽內(nèi)顯示星號,需要給予swiper-item第一個(gè)根節(jié)點(diǎn)一定的margin樣式pattern 要求此參數(shù)值為一個(gè)正則表達(dá)式,如: /\d+/,不能帶引號,如:“/\d+/”,組件會對字段進(jìn)行正則判斷,返回結(jié)果。
min 最小值,如果字段類型為字符串和數(shù)組,會取字符串長度與數(shù)組長度(length)與min比較,如果字段是數(shù)值,則直接與min比較。
max 最大值,規(guī)則同min參數(shù)
len 指定長度,規(guī)則同min,優(yōu)先級高于min和max
enum{Array} 指定的值,配合 type: ‘enum’ 使用
whitespace{Boolean} 如果字段值內(nèi)容都為空格,默認(rèn)無法通過required:
true校驗(yàn),如果要允許通過,需要將此參數(shù)設(shè)置為truetransform{Function},校驗(yàn)前對值進(jìn)行轉(zhuǎn)換,函數(shù)的參數(shù)為當(dāng)前值,返回值為改變后的值,參數(shù)如如下:
value:當(dāng)前校驗(yàn)字段的值 message 校驗(yàn)不通過時(shí)的提示信息
validator{Function}:自定義同步校驗(yàn)函數(shù),參數(shù)如下:
rule:當(dāng)前校驗(yàn)字段在 rules 中所對應(yīng)的校驗(yàn)規(guī)則 value:當(dāng)前校驗(yàn)字段的值
callback:校驗(yàn)完成時(shí)的回調(diào),一般無需執(zhí)行callback,返回true(校驗(yàn)通過)或者false(校驗(yàn)失敗)即可
asyncValidator{Function}:自定義異步校驗(yàn)函數(shù),參數(shù)如下:rule:當(dāng)前校驗(yàn)字段在 rules 中所對應(yīng)的校驗(yàn)規(guī)則 value:當(dāng)前校驗(yàn)字段的值
callback:校驗(yàn)完成時(shí)的回調(diào),執(zhí)行完異步操作(比如向后端請求數(shù)據(jù)驗(yàn)證),如果不通過,需要callback(new
Error(‘提示錯(cuò)誤信息’)),如果校驗(yàn)通過,執(zhí)行callback()即可
this.$refs.form1.validateField('userInfo.gender')用于執(zhí)行表單字段的校驗(yàn)處理;
this.$refs.form1.validate()用于執(zhí)行表單提交時(shí)各個(gè)字段的校驗(yàn)處理;
補(bǔ)充:
from表單中input與左邊的lable距離過大問題處理方式:直接修改u-form-item中的label-width即可;另外u-input中如果想添加邊框,可以使用customStyle屬性,添加示例:
<u-input placeholder="請輸入密碼" customStyle="border: 5rpx solid #36373d;border-radius: 20rpx;"></u-input>
附:uview表單校驗(yàn)使用的坑
我們在使用uview的時(shí)候有些表單項(xiàng)是不允許用戶修改的,對應(yīng)input綁定的數(shù)據(jù)是用戶點(diǎn)擊選擇框獲得的,所以我們在input上寫了disabled屬性來禁用輸入框,但是禁用之后無法觸發(fā)表單校驗(yàn)的change以及blur,當(dāng)表單校驗(yàn)不通過,即使后面我們的數(shù)據(jù)是通過驗(yàn)證的但是提示消息依然存在,雖然可以通過表單驗(yàn)證,但是造成用戶體驗(yàn)不好。后面我在想不使用disabled使用readonly但是發(fā)現(xiàn)uniapp不支持這個(gè)屬性。
photo: [
{
// 自定義驗(yàn)證函數(shù),見上說明
validator: (rule, value, callback) => {
if (this.form.imgUrl) {
return true
}
if (!this.form.imgUrl) {
return false
}
},
message: '請選擇圖片',
// 觸發(fā)器可以同時(shí)用blur和change
trigger: ['blur', 'change'],
},
],以上校驗(yàn)規(guī)則無法觸發(fā)觸發(fā)器,只有調(diào)用表單校驗(yàn)方法的時(shí)候提示才會消失
我的解決思路,不在表單校驗(yàn)上述表單項(xiàng),在用戶點(diǎn)擊提交的時(shí)候自己寫方法判斷,要是判斷不通過則彈框提示
官方參考鏈接:https://www.uviewui.com/components/form.html
總結(jié)
到此這篇關(guān)于uniapp和uview2.0實(shí)現(xiàn)表單校驗(yàn)實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)uniapp和uview2.0表單校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js調(diào)用后臺、后臺調(diào)用前臺等方法總結(jié)
這篇文章主要對js調(diào)用后臺,后臺調(diào)用前臺等方法做個(gè)總結(jié),需要的朋友可以參考下2014-04-04
JavaScript知識點(diǎn)總結(jié)(十一)之js中的Object類詳解
這篇文章主要介紹了JavaScript知識點(diǎn)總結(jié)(十一)之js中的Object類詳解的相關(guān)資料,需要的朋友可以參考下2016-05-05
bootstrap選項(xiàng)卡擴(kuò)展功能詳解
這篇文章主要為大家詳細(xì)介紹了bootstrap選項(xiàng)卡擴(kuò)展功能,增加關(guān)閉,超出一行顯示下拉,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

