手把手教你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)證使用,每一個表單域由一個u-form-item組成,表單域中可以放置u-input、u-checkbox、u-radio、u-switch等。
在表單組中,通過model參數(shù)綁定一個對象,這個對象的屬性為各個u-form-item內(nèi)組件的對應(yīng)變量。
由于表單驗(yàn)證和綁定表單規(guī)則時,需要通過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)在有一個用戶信息表單信息,包含基本的用戶昵稱、頭像、生日、簡介信息,現(xiàn)在需要對各字段進(jìn)行校驗(yàn)。點(diǎn)擊提交時都為空時的異常提示信息如下圖:
代碼內(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個字" 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)錯" @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)閉時校驗(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)閉時校驗(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用于定義表單各個屬性的校驗(yàn)內(nèi)容如下:
trigger{String | Array}:觸發(fā)校驗(yàn)的方式有2種:
change:字段值發(fā)生變化時校驗(yàn) blur:輸入框失去焦點(diǎn)時觸發(fā) 如果同時監(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)容是否一個正則表達(dá)式,而不是用這個正則去匹配字段值 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第一個根節(jié)點(diǎn)一定的margin樣式pattern 要求此參數(shù)值為一個正則表達(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)不通過時的提示信息
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)完成時的回調(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)完成時的回調(diào),執(zhí)行完異步操作(比如向后端請求數(shù)據(jù)驗(yàn)證),如果不通過,需要callback(new
Error(‘提示錯誤信息’)),如果校驗(yàn)通過,執(zhí)行callback()即可
this.$refs.form1.validateField('userInfo.gender')
用于執(zhí)行表單字段的校驗(yàn)處理;
this.$refs.form1.validate()
用于執(zhí)行表單提交時各個字段的校驗(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的時候有些表單項(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不支持這個屬性。
photo: [ { // 自定義驗(yàn)證函數(shù),見上說明 validator: (rule, value, callback) => { if (this.form.imgUrl) { return true } if (!this.form.imgUrl) { return false } }, message: '請選擇圖片', // 觸發(fā)器可以同時用blur和change trigger: ['blur', 'change'], }, ],
以上校驗(yàn)規(guī)則無法觸發(fā)觸發(fā)器,只有調(diào)用表單校驗(yàn)方法的時候提示才會消失
我的解決思路,不在表單校驗(yàn)上述表單項(xiàng),在用戶點(diǎn)擊提交的時候自己寫方法判斷,要是判斷不通過則彈框提示
官方參考鏈接: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)用前臺等方法做個總結(jié),需要的朋友可以參考下2014-04-04JavaScript知識點(diǎn)總結(jié)(十一)之js中的Object類詳解
這篇文章主要介紹了JavaScript知識點(diǎn)總結(jié)(十一)之js中的Object類詳解的相關(guān)資料,需要的朋友可以參考下2016-05-05bootstrap選項(xiàng)卡擴(kuò)展功能詳解
這篇文章主要為大家詳細(xì)介紹了bootstrap選項(xiàng)卡擴(kuò)展功能,增加關(guān)閉,超出一行顯示下拉,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06