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

代碼內容:
<template>
<view>
<!-- 注意,如果需要兼容微信小程序,最好通過setRules方法設置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個字" 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="如果選擇保密會報錯"
@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 壓縮圖,默認二者都有
sourceType: ['album', 'camera', '海報圖庫'], //album 從相冊選圖,camera 使用相機,默認二者都有。
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', // 默認
formData: { // 其他的formdata參數(shù)
fileType: '2',
uid: '10001',
fileContainerName: 'default'
},
success: res => {
let data = JSON.parse(res.data) //返回的是字符串,需要轉成對象格式,打印data如下圖
if (data.code == 200) {
console.log(data.msg) //圖片地址
}
},
fail: () => {}
})
},
// 顯示性別列表并校驗性別是否為那女
genderSelect(e) {
this.model1.userInfo.gender = e.name
this.$refs.form1.validateField('userInfo.gender')
// 校驗頭像是否上傳
// this.$refs.form1.validateField('userInfo.userImg')
},
// 性別選擇關閉,校驗是否選擇性別
genderClose() {
this.$refs.form1.validateField('userInfo.gender')
},
// 生日選擇關閉時校驗生日格式以及是否為空
birthdayConfirm(e) {
this.showBirthday = false
this.model1.userInfo.birthday = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
this.$refs.form1.validateField('userInfo.birthday')
},
// 生日列表關閉時校驗是否為空
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('校驗通過')
// 調用服務端入表接口
}).catch(errors => {
console.log("失敗信息:" + JSON.stringify(errors))
// uni.$u.toast('校驗失敗')
})
}
},
onReady() {
//如果需要兼容微信小程序,并且校驗規(guī)則中含有方法等,只能通過setRules方法設置規(guī)則。
this.$refs.form1.setRules(this.rules)
}
};
</script>
<style lang="scss">
</style>
規(guī)則說明:
校驗規(guī)則需要從u--form組件中指定規(guī)則名,此處為rules,data屬性中rules用于定義表單各個屬性的校驗內容如下:
trigger{String | Array}:觸發(fā)校驗的方式有2種:
change:字段值發(fā)生變化時校驗 blur:輸入框失去焦點時觸發(fā) 如果同時監(jiān)聽兩種方式,需要寫成數(shù)組形式:[‘change’,
‘blur’] type{String}
內置校驗規(guī)則,如這些規(guī)則無法滿足需求,可以使用正則匹配、或者使用validator自定義方法并結合uView自帶驗證規(guī)則。string:必須是 string 類型,默認類型 number:必須是 number 類型 boolean:必須是 boolean 類型
method:必須是 function 類型 regexp:必須是 regexp
類型,這里的正則,指的是判斷字段的內容是否一個正則表達式,而不是用這個正則去匹配字段值 integer:必須是整數(shù)類型
float:必須是浮點數(shù)類型 array:必須是 array 類型 object:必須是 object 類型 enum:必須出現(xiàn)在 enmu
指定的值中 date:必須是 date 類型 url:必須是 url 類型 hex:必須是 16 進制類型 email:必須是 email
類型 any:任意類型 required
布爾值,是否必填,配置此參數(shù)不會顯示輸入框左邊的必填星號,如需要,請配置u-form-item的required為true,注意:如需在swiper標簽內顯示星號,需要給予swiper-item第一個根節(jié)點一定的margin樣式pattern 要求此參數(shù)值為一個正則表達式,如: /\d+/,不能帶引號,如:“/\d+/”,組件會對字段進行正則判斷,返回結果。
min 最小值,如果字段類型為字符串和數(shù)組,會取字符串長度與數(shù)組長度(length)與min比較,如果字段是數(shù)值,則直接與min比較。
max 最大值,規(guī)則同min參數(shù)
len 指定長度,規(guī)則同min,優(yōu)先級高于min和max
enum{Array} 指定的值,配合 type: ‘enum’ 使用
whitespace{Boolean} 如果字段值內容都為空格,默認無法通過required:
true校驗,如果要允許通過,需要將此參數(shù)設置為truetransform{Function},校驗前對值進行轉換,函數(shù)的參數(shù)為當前值,返回值為改變后的值,參數(shù)如如下:
value:當前校驗字段的值 message 校驗不通過時的提示信息
validator{Function}:自定義同步校驗函數(shù),參數(shù)如下:
rule:當前校驗字段在 rules 中所對應的校驗規(guī)則 value:當前校驗字段的值
callback:校驗完成時的回調,一般無需執(zhí)行callback,返回true(校驗通過)或者false(校驗失敗)即可
asyncValidator{Function}:自定義異步校驗函數(shù),參數(shù)如下:rule:當前校驗字段在 rules 中所對應的校驗規(guī)則 value:當前校驗字段的值
callback:校驗完成時的回調,執(zhí)行完異步操作(比如向后端請求數(shù)據(jù)驗證),如果不通過,需要callback(new
Error(‘提示錯誤信息’)),如果校驗通過,執(zhí)行callback()即可
this.$refs.form1.validateField('userInfo.gender')用于執(zhí)行表單字段的校驗處理;
this.$refs.form1.validate()用于執(zhí)行表單提交時各個字段的校驗處理;
補充:
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表單校驗使用的坑
我們在使用uview的時候有些表單項是不允許用戶修改的,對應input綁定的數(shù)據(jù)是用戶點擊選擇框獲得的,所以我們在input上寫了disabled屬性來禁用輸入框,但是禁用之后無法觸發(fā)表單校驗的change以及blur,當表單校驗不通過,即使后面我們的數(shù)據(jù)是通過驗證的但是提示消息依然存在,雖然可以通過表單驗證,但是造成用戶體驗不好。后面我在想不使用disabled使用readonly但是發(fā)現(xiàn)uniapp不支持這個屬性。
photo: [
{
// 自定義驗證函數(shù),見上說明
validator: (rule, value, callback) => {
if (this.form.imgUrl) {
return true
}
if (!this.form.imgUrl) {
return false
}
},
message: '請選擇圖片',
// 觸發(fā)器可以同時用blur和change
trigger: ['blur', 'change'],
},
],以上校驗規(guī)則無法觸發(fā)觸發(fā)器,只有調用表單校驗方法的時候提示才會消失
我的解決思路,不在表單校驗上述表單項,在用戶點擊提交的時候自己寫方法判斷,要是判斷不通過則彈框提示
官方參考鏈接:https://www.uviewui.com/components/form.html
總結
到此這篇關于uniapp和uview2.0實現(xiàn)表單校驗實戰(zhàn)的文章就介紹到這了,更多相關uniapp和uview2.0表單校驗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
js實現(xiàn)圖片區(qū)域可點擊大小隨意改變(適用移動端)代碼實例
這篇文章主要介紹了js實現(xiàn)圖片區(qū)域可點擊大小隨意改變(適用移動端)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09
js+html5實現(xiàn)canvas繪制網(wǎng)頁時鐘的方法
這篇文章主要介紹了js+html5實現(xiàn)canvas繪制網(wǎng)頁時鐘的方法,涉及html5圖形繪制的基礎技巧,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
基于layui數(shù)據(jù)表格以及傳數(shù)據(jù)的方式
今天小編就為大家分享一篇基于layui數(shù)據(jù)表格以及傳數(shù)據(jù)的方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08

