uniapp表單校驗(yàn)超詳細(xì)講解
uni-forms表單校驗(yàn)
1、uni-forms 需要通過rules屬性傳入約定的校驗(yàn)規(guī)則。
2、uni-forms 需要綁定model屬性,值為表單的key/value組成的對象
3、uni-forms-item 需要設(shè)置name 屬性為當(dāng)前字段名,字段為String|Array類型
4、只要使用的組件不管內(nèi)置組件還是三方組件,只需綁定v-model,無需其他操作
5、如果使用原生checkbox或三方組件不支持v-model等,只需要給罪案綁定binddata方法即可出發(fā)表單校驗(yàn),無需綁定事件到methods中
6、binddata('name',$event.detail.value,'form')方法接受三個(gè)值,
第一個(gè)參數(shù)傳入當(dāng)前表單組件所在的name,同當(dāng)前父組件uni-forms-item 綁定屬性name的值
第二個(gè)參數(shù)傳入需要校驗(yàn)的值,內(nèi)置 組件可以通過$event.detail.value 獲取到組件的返回值,自定義組件傳入需要校驗(yàn)的值即可
第三個(gè)參數(shù)傳入uni-forms組件綁定屬性ref的值,通常在多表單的時(shí)候需要傳入,用來區(qū)分表單,如頁面中僅有一個(gè)uni-forms可忽略
7、如果內(nèi)置binddata方法無法滿足需求,在當(dāng)前頁面的methods中復(fù)寫此方法即可,復(fù)寫此方法需要調(diào)用uni-forms的setValue來觸發(fā)表單校驗(yàn)
<template> <view> <uni-forms ref="form" :modelValue="formData" :rules="rules"> <uni-forms-item label="姓名" name="name"> <uni-easyinput type="text" v-model="formData.name" placeholder="請輸入姓名" /> </uni-forms-item> <uni-forms-item label="郵箱" name="email"> <input class="input" v-model="formData.email" type="text" placeholder="請輸入用戶名" @input="binddata('email',$event.detail.value)" /> </uni-forms-item> </uni-forms> <button @click="submit">Submit</button> </view> </template> <script> export default { data() { return { // 表單數(shù)據(jù) formData: { name: 'LiMing', email: 'dcloud@email.com' }, rules: { // 對name字段進(jìn)行必填驗(yàn)證 name: { rules: [{ required: true, errorMessage: '請輸入姓名', }, { minLength: 3, maxLength: 5, errorMessage: '姓名長度在 {minLength} 到 {maxLength} 個(gè)字符', } ] }, // 對email字段進(jìn)行必填驗(yàn)證 email: { rules: [{ format: 'email', errorMessage: '請輸入正確的郵箱地址', }] } } } }, methods: { /** * 復(fù)寫 binddata 方法,如果只是為了校驗(yàn),無復(fù)雜自定義操作,可忽略此方法 * @param {String} name 字段名稱 * @param {String} value 表單域的值 */ // binddata(name,value){ // 通過 input 事件設(shè)置表單指定 name 的值 // this.$refs.form.setValue(name, value) // }, // 觸發(fā)提交表單 submit() { this.$refs.form.validate().then(res=>{ console.log('表單數(shù)據(jù)信息:', res); }).catch(err =>{ console.log('表單錯(cuò)誤信息:', err); }) } } } </script>
校驗(yàn)規(guī)則說明
校驗(yàn)規(guī)則接受一個(gè)Object類型的值,通過傳入不同的規(guī)則來表示每個(gè)表單域的值該如何校驗(yàn)
對象的key表示當(dāng)前表單域的字段名,value為具體的校驗(yàn)規(guī)則
以下為value所包含的內(nèi)容
屬性名 | 類型 | 說明 |
rules | Array | 校驗(yàn)規(guī)則,下方rules屬性說明 |
validateTrigger | String | 表單校驗(yàn)時(shí)機(jī)【1.4.0】已廢棄 |
label | String | 當(dāng)前表單域的字段中文名,多用于errMessage的顯示,可以不填 |
rules: { // 對name字段進(jìn)行必填驗(yàn)證 name: { // name 字段的校驗(yàn)規(guī)則 rules:[ // 校驗(yàn) name 不能為空 { required: true, errorMessage: '請?zhí)顚懶彰?, }, // 對name字段進(jìn)行長度驗(yàn)證 { minLength: 3, maxLength: 5, errorMessage: '{label}長度在 {minLength} 到 {maxLength} 個(gè)字符', } ], // 當(dāng)前表單域的字段中文名,可不填寫 label:'姓名', validateTrigger:'submit' } }
rules 屬性說明
每一個(gè)驗(yàn)證規(guī)則中,可以配置多個(gè)屬性,下面是一些常見規(guī)則屬性
屬性名 | 類型 | 默認(rèn)值 | 可選值 | 說明 |
required | Boolean | - | - | 是否必填,配置此參數(shù)不會(huì)顯示輸入框左邊的必填星號,如需要,請配置uni-forms-item組件的的required為true |
range | Array | - | - | 數(shù)組至少要有一個(gè)元素,且數(shù)組內(nèi)的每一個(gè)元素都是唯一的。 |
format | String | - | - | 內(nèi)置校驗(yàn)規(guī)則,如這些規(guī)則無法滿足需求,可以使用正則匹配或者自定義規(guī)則 |
pattern | RegExp | - | - | 正則表達(dá)式,注意事項(xiàng)見下方說明 |
maximum | Number | - | - | 校驗(yàn)最大值(大于) |
minimum | Number | - | - | 校驗(yàn)最小值(小于) |
maxLength | Number | - | - | 校驗(yàn)數(shù)據(jù)最大長度 |
errorMessage | String | - | - | 校驗(yàn)失敗提示信息語,可添加屬性占位符,當(dāng)前表格內(nèi)屬性都可用作占位符 |
validateFunction | Function | - | - | 自定義校驗(yàn)規(guī)則 |
format屬性值說明
屬性名 | 說明 |
string | 必須是 string 類型,默認(rèn)類型 |
number | 必須是 number 類型 |
boolean | 必須是 boolean 類型 |
array | 必須是 array 類型 |
object | 必須是 object 類型 |
url | 必須是 url 類型 |
必須是 email 類型 |
validateFunction 自定義校驗(yàn)規(guī)則使用說明
validateFunction 方法返回四個(gè)參數(shù) validateFunction:function(rule,value,data,callback){} ,當(dāng)然返回參數(shù)名開發(fā)者可以自定義:
rule : 當(dāng)前校驗(yàn)字段在 rules 中所對應(yīng)的校驗(yàn)規(guī)則
value : 當(dāng)前校驗(yàn)字段的值
data : 所有校驗(yàn)字段的字段和值的對象
callback : 校驗(yàn)完成時(shí)的回調(diào),一般無需執(zhí)行callback,返回true(校驗(yàn)通過)或者false(校驗(yàn)失敗)即可 ,如果需要顯示不同的 errMessage,如果校驗(yàn)不通過需要執(zhí)行 callback('提示錯(cuò)誤信息'),如果校驗(yàn)通過,執(zhí)行callback()即可
<template> <view> <uni-forms ref="form" :modelValue="formData"> <uni-forms-item label="興趣愛好" required name="hobby"> <uni-data-checkbox v-model="formData.hobby" multiple :localdata="hobbys" /> </uni-forms-item> </uni-forms> <button class="button" @click="submit">校驗(yàn)表單</button> </view> </template> <script> export default { data() { return { formData:{ }, rules: { hobby: { rules: [{ required: true, errorMessage: '請選擇興趣', },{ validateFunction:function(rule,value,data,callback){ if (value.length < 2) { callback('請至少勾選兩個(gè)興趣愛好') } return true } }] } } } }, onReady() { // 需要在onReady中設(shè)置規(guī)則 this.$refs.form.setRules(this.rules) }, methods: { submit(form) { this.$refs.form.validate().then(res=>{ console.log('表單數(shù)據(jù)信息:', res); }).catch(err =>{ console.log('表單錯(cuò)誤信息:', err); }) } } } </script>
validateFunction 異步校驗(yàn)
上面的自定義校驗(yàn)方式為同步校驗(yàn) ,如果需要異步校驗(yàn),validateFunction 需要返回一個(gè) Promise ,校驗(yàn)不通過 執(zhí)行 reject(new Error('錯(cuò)誤信息')) 返回對應(yīng)的錯(cuò)誤信息,如果校驗(yàn)通過則直接執(zhí)行 resolve() 即可,在異步校驗(yàn)方法中,不需要使用 callback 。
<template> <view> <uni-forms :modelValue="formData" ref="form"> <uni-forms-item name="age" label="年齡"> <uni-easyinput v-model="formData.age" type="text" placeholder="請輸入年齡" /> </uni-forms-item> </uni-forms> <button class="button" @click="submit">校驗(yàn)表單</button> </view> </template> <script> export default { data() { return { formData:{ age:'' }, rules: { age: { rules: [{ required: true, errorMessage: '請輸入年齡', },{ validateFunction: (rule, value, data, callback) => { // 異步需要返回 Promise 對象 return new Promise((resolve, reject) => { setTimeout(() => { if (value > 10 ) { // 通過返回 resolve resolve() } else { // 不通過返回 reject(new Error('錯(cuò)誤信息')) reject(new Error('年齡必須大于十歲')) } }, 2000) }) } }] } } } }, onReady() { // 需要在onReady中設(shè)置規(guī)則 this.$refs.form.setRules(this.rules) }, methods: { /** * 表單提交 * @param {Object} event */ submit() { uni.showLoading() this.$refs.form.validate().then(res => { uni.hideLoading() console.log('表單數(shù)據(jù)信息:', res); }).catch(err => { uni.hideLoading() console.log('表單錯(cuò)誤信息:', err); }) } } } </script>
動(dòng)態(tài)表單校驗(yàn)
多用于同一個(gè)字段需要添加多次的場景,如需要?jiǎng)討B(tài)創(chuàng)建多個(gè)域名參與檢驗(yàn)。
- 在 formData 中定義個(gè)變量用來接受同一個(gè)字段的多個(gè)結(jié)果。
dynamicFormData: { email: '', // domains 字段下會(huì)有多個(gè)結(jié)果 domains: [] }
- 使用 uni-forms-item 的 rules 屬性定義單個(gè)表單域的校驗(yàn)規(guī)則。
<uni-forms-item :label="item.label+' '+index" required :rules="[{'required': true,errorMessage: '域名項(xiàng)必填'}]" :key="item.id"> ... </uni-forms-item>
- name 需要?jiǎng)討B(tài)指定,動(dòng)態(tài)表單推薦使用 Array 類型,內(nèi)容從左到右為綁定值的調(diào)用鏈。['domains',index,'value'] 等同于 dynamicFormData.domains[index].value
<uni-forms-item required :label="item.label+' '+index" :name="['domains',index,'value']" :rules="[{'required': true,errorMessage: '域名項(xiàng)必填'}]" :key="item.id" > ... </uni-forms-item>
- 需要綁定值的組件的 v-model 也需要?jiǎng)討B(tài)指定 dynamicFormData.domains[index].value
<uni-forms-item required :label="item.label+' '+index" :name="['domains',index,'value']" :rules="[{'required': true,errorMessage: '域名項(xiàng)必填'}]" :key="item.id" > <uni-easyinput v-model="dynamicFormData.domains[index].value" placeholder="請輸入域名" /> </uni-forms-item>
完整實(shí)例
<uni-forms ref="dynamicForm" :rules="dynamicRules" :model="dynamicFormData"> <uni-forms-item label="郵箱" required name="email"> <uni-easyinput v-model="dynamicFormData.email" placeholder="請輸入姓名" /> </uni-forms-item> <template v-for="(item,index) in dynamicFormData.domains"> <uni-forms-item :label="item.label+' '+index" required :rules="[{'required': true,errorMessage: '域名項(xiàng)必填'}]" :key="item.id" :name="['domains',index,'value']"> <view class="form-item"> <uni-easyinput v-model="dynamicFormData.domains[index].value" placeholder="請輸入域名" /> <button class="button" size="mini" type="default" @click="del(item.id)">刪除</button> </view> </uni-forms-item> </template> </uni-forms> <view class="button-group"> <button type="primary" size="mini" @click="add">新增域名</button> <button type="primary" size="mini" @click="submit('dynamicForm')">提交</button> </view> <script> export default { data() { return { // 數(shù)據(jù)源 dynamicFormData: { email: '', domains: [] }, // 規(guī)則 dynamicRules: { email: { rules: [{ required: true, errorMessage: '域名不能為空' }, { format: 'email', errorMessage: '域名格式錯(cuò)誤' }] } } } }, methods: { // 新增表單域 add() { this.dynamicFormData.domains.push({ label: '域名', value:'', id: Date.now() }) }, // 刪除表單域 del(id) { let index = this.dynamicLists.findIndex(v => v.id === id) this.dynamicLists.splice(index, 1) }, // 提交 submit(ref) { this.$refs[ref].validate((err,value)=>{ console.log(err,value); }) }, } } </script>
表單校驗(yàn)時(shí)機(jī)說明
如果需要子表單需要單獨(dú)的校驗(yàn)時(shí)機(jī),可以使用 uni-forms-item 的 rules 屬性和 onFieldChange 配合
<template> <view> <uni-forms ref="form" :modelValue="formData" validate-trigger="bind"> <uni-forms-item name="age" label="年齡"> <!-- uni-easyinput 的校驗(yàn)時(shí)機(jī)是數(shù)據(jù)發(fā)生變化, 即觸發(fā) input 時(shí) --> <uni-easyinput v-model="formData.age" type="text" placeholder="請輸入年齡" /> </uni-forms-item> <uni-forms-item ref="input" name="email" label="郵箱"> <!-- input 的校驗(yàn)時(shí)機(jī) --> <input v-model="formData.email" @blur="(e)=>$refs.input.onFieldChange($event.detail.value)" /> </uni-forms-item> <button class="button" @click="submit">校驗(yàn)表單</button> </uni-forms> </view> </template>
【1.4.0后此規(guī)則已不生效】對于表單校驗(yàn)時(shí)機(jī),同時(shí)只會(huì)有一個(gè) validateTrigger 發(fā)生作用,它的作用權(quán)重為
規(guī)則 > uni-forms-item > uni-forms
如果規(guī)則里配置 validateTrigger ,則優(yōu)先使用規(guī)則里的 validateTrigger 屬性來決定表單校驗(yàn)時(shí)機(jī)
如果規(guī)則里沒有配置 validateTrigger ,則優(yōu)先使用 uni-forms-item 的 validateTrigger 屬性來決定表單校驗(yàn)時(shí)機(jī)
如果 uni-forms-item 組件里沒有配置 validateTrigger ,則優(yōu)先使用 uni-forms 的 validateTrigger 屬性來決定表單校驗(yàn)時(shí)機(jī)
以此類推,如果都沒有使用 validateTrigger 屬性,則會(huì)使用 uni-forms 的 validateTrigger 屬性默認(rèn)值來決定表單校驗(yàn)時(shí)機(jī)
API
Forms Props
屬性名
類型
默認(rèn)值
可選值
說明
兼容說明
model
Object
-
-
表單數(shù)據(jù)
1.4.0 新增
rules
Object
-
-
表單校驗(yàn)規(guī)則
validateTrigger
String
submit
bind/submit/blur
表單校驗(yàn)時(shí)機(jī),blur僅在 uni-easyinput 中生效
1.4.0 新增 blur 值
label-position
String
left
top/left
label 位置
label-width
String/Number
75
-
label 寬度,單位 px
label-align
String
left
left/center/right
label 居中方式
err-show-type
String
undertext
undertext/toast/modal
表單錯(cuò)誤信息提示方式
border
Boolean
false
-
是否顯示分格線
value
Object
-
-
表單數(shù)據(jù),兼容vue2
即將棄用,請使用 model 代替
modelValue
Object
-
-
表單數(shù)據(jù),兼容vue3
即將棄用,請使用 model 代替
Forms Events
事件稱名
說明
@validate
任意表單項(xiàng)被校驗(yàn)后觸發(fā),返回表單校驗(yàn)信息
Forms Methods
方法稱名
說明
兼容說明
setRules
動(dòng)態(tài)設(shè)置表單規(guī)則
validate
對整個(gè)表單進(jìn)行校驗(yàn)的方法,會(huì)返回一個(gè) promise
validateField
部分表單進(jìn)行校驗(yàn)
clearValidate
移除表單的校驗(yàn)結(jié)果
submit
對整個(gè)表單進(jìn)行校驗(yàn)的方法,會(huì)返回一個(gè) promise
即將棄用,請使用validate代替
setValue
設(shè)置表單某一項(xiàng) name 的對應(yīng)值,通常在 uni-forms-item 和自定表單組件中使用
即將棄用,請使用 onFieldChange 兼容相關(guān)功能
resetFields
重置表單, 需要把uni-forms的modelValue屬性改為v-model,且對內(nèi)置組件可能不生效
1.4.0 已棄用
validate(keepItem:Array,callback:Function) 方法說明
validate 方法是對整個(gè)表單進(jìn)行校驗(yàn),方法接受兩個(gè)參數(shù)
參數(shù)稱名
類型
說明
keepItem
Array
保留不參與校驗(yàn)的字段
callback
Function
校驗(yàn)完成返回函數(shù)
校驗(yàn)成功后,校驗(yàn)對象只保留指定了name的字段(只要 uni-forms-item 綁定了 name,哪怕不校驗(yàn),也會(huì)返回),如果需要保留其他字段,則需要 keepItem 屬性
<template> <view> <uni-forms ref="form" :modelValue="formData"> <uni-forms-item name="age" label="年齡"> <uni-easyinput v-model="formData.age" type="text" placeholder="請輸入年齡" /> </uni-forms-item> <button class="button" @click="submit">校驗(yàn)表單</button> </uni-forms> </view> </template> <script> export default { data() { return { formData:{ age:'' }, rules: { // ... } } }, onLoad(){ this.formData.id = 'testId' }, methods: { submit() { // 在 onLoad 生命周期中,formData添加了一個(gè) id 字段 ,此時(shí)這個(gè)字段是不參數(shù)校驗(yàn)的,所以結(jié)果中不返回 // 在 validate(['id']) 方法中,指定第一個(gè)參數(shù) ,即可返回id字段 this.$refs.form.validate(['id'],(err,formData)=>{ if(!err){ console.log('success',formData) } }) } } } </script>
validate 方法還可以返回一個(gè) Promise 對象,如果使用了 callback 則Promise 返回 null,validate 方法會(huì)優(yōu)先使用 callback。
callback 方法會(huì)返回兩個(gè)返回值 :
第一個(gè)返回值為檢驗(yàn)結(jié)果,如果校驗(yàn)失敗,則返回失敗信息,如果成功,返回 null
第二個(gè)返回值校驗(yàn)數(shù)據(jù)
// 使用 callback // 如果不需要 keepItem 參數(shù) ,則可以省略 this.$refs.form.validate((err,formData)=>{ // 如果校驗(yàn)成功 ,err 返回 null if(!err){ console.log('success',formData) return } console.log('error',err) }).then(res=>{ // res 返回 null }) // 使用 Promise // 對整個(gè)表單進(jìn)行校驗(yàn),返回一個(gè) Promise this.$refs.form.validate().then((res)=>{ // 成功返回,res 為表單數(shù)據(jù) // 其他邏輯處理 // ... }).catch((err)=>{ // 表單校驗(yàn)驗(yàn)失敗,err 為具體錯(cuò)誤信息 // 其他邏輯處理 // ... })
setValue(name:String,value:any) 方法說明
setValue 方法通常用于內(nèi)置組件或三方組件返回值的校驗(yàn),因?yàn)閡ni-esayinput 等 uni 開頭的組件內(nèi)置了對 uni-forms的支持,所以這些組件返回的值可以直接使用,但是比如像input 這些內(nèi)置組件值的變化,無法及時(shí)通知 uni-forms ,從而無法正常的校驗(yàn),這時(shí)就需要我們手動(dòng)將這些值加入到uni-forms的校驗(yàn)。
setValue 方法接受兩個(gè)參數(shù):
name: 表單域?qū)?yīng)的name
value: 表單域?qū)?yīng)的值
<template> <view> <uni-forms ref="form" :modelValue="formData"> <uni-forms-item name="age" label="年齡"> <input v-model="formData.age" @input="setValue('age',formData.age)"> </uni-forms-item> <button class="button" @click="submit">校驗(yàn)表單</button> </uni-forms> </view> </template> <script> export default { data() { return { formData:{ age:'' }, rules: { // ... } } }, methods: { setValue(name,value){ // 設(shè)置表單某項(xiàng)對應(yīng)得值來觸發(fā)表單校驗(yàn) // 接受兩個(gè)參數(shù),第一個(gè)參數(shù)為表單域的 name ,第二個(gè)參數(shù)為表單域的值 this.$refs.form.setValue(name,value) }, submit() { this.$refs.form.validate(['id'],(err,formData)=>{ if(!err){ console.log('success',formData) } }) } } } </script>
其他方法說明
// 設(shè)置規(guī)則 this.$refs.form.setRules({ //... }) // 部分表單進(jìn)行校驗(yàn),接受一個(gè)參數(shù),類型為 String 或 Array ,只校驗(yàn)傳入 name 表單域的值 this.$refs.form.validateField(['name', 'email']).then((res)=>{ // 成功返回,res 為對應(yīng)表單數(shù)據(jù) // 其他邏輯處理 // ... }).catch((err)=>{ // 表單校驗(yàn)驗(yàn)失敗,err 為具體錯(cuò)誤信息 // 其他邏輯處理 // ... }) // 移除表單校驗(yàn),接受一個(gè)參數(shù),類型為 String 或 Array ,只移除傳入 name 表單域的值,如果不傳入?yún)?shù),則移除所有 this.$refs.form.clearValidate(['name', 'email'])
FormsItem Props
屬性名
類型
默認(rèn)值
可選值
說明
兼容說明
name
String/Array
-
-
表單域的屬性名,在使用校驗(yàn)規(guī)則時(shí)必填
rules
Object
-
-
表單校驗(yàn)規(guī)則
required
Boolean
false
-
label 右邊顯示紅色"*"號,樣式顯示不會(huì)對校驗(yàn)規(guī)則產(chǎn)生效果
label
String
-
-
輸入框左邊的文字提示
label-width
Number
70
-
label的寬度,單位px
error-message
String
-
-
顯示的錯(cuò)誤提示內(nèi)容,如果為空字符串或者false,則不顯示錯(cuò)誤信息
label-align
String
left
left/center/right
label的文字對齊方式
label-position
String
left
top/left
label的文字的位置
1.4.0已棄用 ,統(tǒng)一使用 uni-forms 的對齊方式
validateTrigger
String
submit
bind/submit
表單校驗(yàn)時(shí)機(jī)
1.4.0已棄用,統(tǒng)一使用 uni-forms 的校驗(yàn)時(shí)機(jī)
left-icon
String
-
-
label左邊的圖標(biāo),限uni-ui的圖標(biāo)名稱
1.4.0已棄用 ,請使用 #label 插槽實(shí)現(xiàn)相關(guān)功能
icon-color
String
#606266
-
左邊通過icon配置的圖標(biāo)的顏色
1.4.0已棄用 ,請使用 #label 插槽實(shí)現(xiàn)相關(guān)功
FormsItem Methods
方法稱名
說明
兼容說明
setRules
動(dòng)態(tài)設(shè)置表單規(guī)則
onFieldChange
校驗(yàn)子表單
1.4.0新增
FormsItem Slots
插槽名
說明
default
默認(rèn)插槽
label
label插槽,自定義label顯示內(nèi)容
示例
<template> <view class="container"> <uni-card :is-shadow="false" is-full> <text class="uni-h6">uni-forms 組件一般由輸入框、選擇器、單選框、多選框等控件組成,用以收集、校驗(yàn)、提交數(shù)據(jù)。</text> </uni-card> <uni-section title="基本用法" type="line"> <view class="example"> <!-- 基礎(chǔ)用法,不包含校驗(yàn)規(guī)則 --> <uni-forms ref="baseForm" :modelValue="baseFormData"> <uni-forms-item label="姓名" required> <uni-easyinput v-model="baseFormData.name" placeholder="請輸入姓名" /> </uni-forms-item> <uni-forms-item label="年齡" required> <uni-easyinput v-model="baseFormData.age" placeholder="請輸入年齡" /> </uni-forms-item> <uni-forms-item label="性別" required> <uni-data-checkbox v-model="baseFormData.sex" :localdata="sexs" /> </uni-forms-item> <uni-forms-item label="興趣愛好" required> <uni-data-checkbox v-model="baseFormData.hobby" multiple :localdata="hobbys" /> </uni-forms-item> <uni-forms-item label="自我介紹"> <uni-easyinput type="textarea" v-model="baseFormData.introduction" placeholder="請輸入自我介紹" /> </uni-forms-item> <uni-forms-item label="日期時(shí)間"> <uni-datetime-picker type="datetime" return-type="timestamp" v-model="baseFormData.datetimesingle"/> </uni-forms-item> </uni-forms> </view> </uni-section> <uni-section title="對齊方式" type="line"> <view class="example"> <view class="segmented-control"> <uni-segmented-control :current="current" :values="items" @clickItem="onClickItem" styleType="button"> </uni-segmented-control> </view> <!-- 展示不同的排列方式 --> <uni-forms ref="baseForm" :modelValue="alignmentFormData" :label-position="alignment"> <uni-forms-item label="姓名" required> <uni-easyinput v-model="baseFormData.name" placeholder="請輸入姓名" /> </uni-forms-item> <uni-forms-item label="年齡" required> <uni-easyinput v-model="baseFormData.age" placeholder="請輸入年齡" /> </uni-forms-item> </uni-forms> </view> </uni-section> <uni-section title="表單校驗(yàn)" type="line"> <view class="example"> <!-- 基礎(chǔ)表單校驗(yàn) --> <uni-forms ref="valiForm" :rules="rules" :modelValue="valiFormData"> <uni-forms-item label="姓名" required name="name"> <uni-easyinput v-model="valiFormData.name" placeholder="請輸入姓名" /> </uni-forms-item> <uni-forms-item label="年齡" required name="age"> <uni-easyinput v-model="valiFormData.age" placeholder="請輸入年齡" /> </uni-forms-item> <uni-forms-item label="自我介紹" name="introduction"> <uni-easyinput type="textarea" v-model="valiFormData.introduction" placeholder="請輸入自我介紹" /> </uni-forms-item> </uni-forms> <button type="primary" @click="submit('valiForm')">提交</button> </view> </uni-section> <uni-section title="自定義校驗(yàn)規(guī)則" type="line"> <view class="example"> <!-- 自定義表單校驗(yàn) --> <uni-forms ref="customForm" :rules="customRules" :modelValue="customFormData"> <uni-forms-item label="姓名" required name="name"> <uni-easyinput v-model="customFormData.name" placeholder="請輸入姓名" /> </uni-forms-item> <uni-forms-item label="年齡" required name="age"> <uni-easyinput v-model="customFormData.age" placeholder="請輸入年齡" /> </uni-forms-item> <uni-forms-item label="興趣愛好" required name="hobby"> <uni-data-checkbox v-model="customFormData.hobby" multiple :localdata="hobbys" /> </uni-forms-item> </uni-forms> <button type="primary" @click="submit('customForm')">提交</button> </view> </uni-section> <uni-section title="動(dòng)態(tài)表單" type="line"> <view class="example"> <!-- 動(dòng)態(tài)表單校驗(yàn) --> <uni-forms ref="dynamicForm" :rules="dynamicRules" :modelValue="dynamicFormData"> <uni-forms-item label="郵箱" required name="email"> <uni-easyinput v-model="dynamicFormData.email" placeholder="請輸入姓名" /> </uni-forms-item> <uni-forms-item v-for="(item,index) in dynamicLists" :key="item.id" :label="item.label+' '+index" required :rules="item.rules" :name="'domains[' + item.id + ']'"> <view class="form-item"> <uni-easyinput v-model="dynamicFormData.domains[item.id]" placeholder="請輸入域名" /> <button class="button" size="mini" type="default" @click="del(item.id)">刪除</button> </view> </uni-forms-item> </uni-forms> <view class="button-group"> <button type="primary" size="mini" @click="add">新增域名</button> <button type="primary" size="mini" @click="submit('dynamicForm')">提交</button> </view> </view> </uni-section> </view> </template> <script> export default { data() { return { // 基礎(chǔ)表單數(shù)據(jù) baseFormData: { name: '', age: '', introduction: '', sex: 2, hobby: [5], datetimesingle: 1627529992399 }, // 表單數(shù)據(jù) alignmentFormData: { name: '', age: '', }, // 單選數(shù)據(jù)源 sexs: [{ text: '男', value: 0 }, { text: '女', value: 1 }, { text: '保密', value: 2 }], // 多選數(shù)據(jù)源 hobbys: [{ text: '跑步', value: 0 }, { text: '游泳', value: 1 }, { text: '繪畫', value: 2 }, { text: '足球', value: 3 }, { text: '籃球', value: 4 }, { text: '其他', value: 5 }], // 分段器數(shù)據(jù) current: 0, items: ['左對齊', '頂部對齊'], // 校驗(yàn)表單數(shù)據(jù) valiFormData: { name: '', age: '', introduction: '', }, // 校驗(yàn)規(guī)則 rules: { name: { rules: [{ required: true, errorMessage: '姓名不能為空' }] }, age: { rules: [{ required: true, errorMessage: '年齡不能為空' }, { format: 'number', errorMessage: '年齡只能輸入數(shù)字' }] } }, // 自定義表單數(shù)據(jù) customFormData: { name: '', age: '', hobby: [] }, // 自定義表單校驗(yàn)規(guī)則 customRules: { name: { rules: [{ required: true, errorMessage: '姓名不能為空' }] }, age: { rules: [{ required: true, errorMessage: '年齡不能為空' }] }, hobby: { rules: [{ format: 'array' }, { validateFunction: function(rule, value, data, callback) { if (value.length < 2) { callback('請至少勾選兩個(gè)興趣愛好') } return true } } ] } }, dynamicFormData: { email: '', domains: {} }, dynamicLists: [], dynamicRules: { email: { rules: [{ required: true, errorMessage: '域名不能為空' }, { format: 'email', errorMessage: '域名格式錯(cuò)誤' }] } } } }, computed: { // 處理表單排列切換 alignment() { if (this.current === 0) return 'left' if (this.current === 1) return 'top' return 'left' } }, onLoad() {}, onReady() { // 設(shè)置自定義表單校驗(yàn)規(guī)則,必須在節(jié)點(diǎn)渲染完畢后執(zhí)行 this.$refs.customForm.setRules(this.customRules) }, methods: { onClickItem(e) { console.log(e); this.current = e.currentIndex }, add() { this.dynamicLists.push({ label: '域名', rules: [{ 'required': true, errorMessage: '域名項(xiàng)必填' }], id: Date.now() }) }, del(id) { let index = this.dynamicLists.findIndex(v => v.id === id) this.dynamicLists.splice(index, 1) }, submit(ref) { this.$refs[ref].validate().then(res => { console.log('success', res); uni.showToast({ title: `校驗(yàn)通過` }) }).catch(err => { console.log('err', err); }) }, } } </script> <style lang="scss"> .example { padding: 15px; background-color: #fff; } .segmented-control { margin-bottom: 15px; } .button-group { margin-top: 15px; display: flex; justify-content: space-around; } .form-item { display: flex; align-items: center; } .button { display: flex; align-items: center; height: 35px; margin-left: 10px; } </style>
總結(jié)
到此這篇關(guān)于uniapp表單校驗(yàn)的文章就介紹到這了,更多相關(guān)uniapp表單校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將json轉(zhuǎn)換成struts參數(shù)的方法
下面小編就為大家?guī)硪黄獙son轉(zhuǎn)換成struts參數(shù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11javascript解析json數(shù)據(jù)的3種方式
這篇文章主要介紹了解析json數(shù)據(jù)的3種方式,需要的朋友可以參考下2014-05-05Extjs4實(shí)現(xiàn)兩個(gè)GridPanel之間數(shù)據(jù)拖拽功能具體方法
這篇文章主要介紹了Extjs4實(shí)現(xiàn)兩個(gè)GridPanel之間數(shù)據(jù)拖拽功能具體方法,有需要的朋友可以參考一下2013-11-11webpack是如何實(shí)現(xiàn)模塊化加載的方法
這篇文章主要介紹了webpack是如何實(shí)現(xiàn)模塊化加載的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11JavaScript輸出當(dāng)前時(shí)間Unix時(shí)間戳的方法
這篇文章主要介紹了JavaScript輸出當(dāng)前時(shí)間Unix時(shí)間戳的方法,涉及javascript中Date及getTime等函數(shù)操作時(shí)間的使用技巧,需要的朋友可以參考下2015-04-04JavaScript實(shí)現(xiàn)九宮格拖拽效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)九宮格拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06微信小程序-橫向滑動(dòng)scroll-view隱藏滾動(dòng)條
本篇文章主要介紹了微信小程序-橫向滑動(dòng)scroll-view隱藏滾動(dòng)條的相關(guān)知識。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04快速掌握WordPress中加載JavaScript腳本的方法
這篇文章主要介紹了快速掌握WordPress中加載JavaScript腳本的方法,以及響應(yīng)的CSS樣式加載方法的簡介,需要的朋友可以參考下2015-12-12