Vue表單校驗(yàn)validate和validateField的使用及區(qū)別詳解
在ant design框架開發(fā)的項(xiàng)目中,使用 FormModel 實(shí)現(xiàn)表單功能。在對表單進(jìn)行校驗(yàn)時,只需要通過 rules 屬性傳入約定的驗(yàn)證規(guī)則,并將 FormItem 的 prop 屬性設(shè)置為需校驗(yàn)的字段名即可。
更多配置詳見:https://1x.antdv.com/components/form-model-cn/
validate 會對整個表單進(jìn)行校驗(yàn),只要綁定了 prop 屬性的表單項(xiàng) ,都會被校驗(yàn)。validateField 可以只對表單中的部分字段進(jìn)行校驗(yàn)。
代碼示例:
template 表單渲染
<a-form-model ref="Form" :model="form" :rules="rules"> <a-form-model-item prop="mobile"> <a-input v-model="form.mobile" size="large" placeholder="請輸入手機(jī)號" :maxLength="50" /> </a-form-model-item> <a-form-model-item prop="verificationCode" class="other"> <a-input v-model="form.verificationCode" size="large" placeholder="請輸入驗(yàn)證碼" :maxLength="6" /> <a-button size="large" :disabled="state.smsSendBtn || !form.mobile" @click="getCode"> {{ state.smsSendBtn ? '已發(fā)送(' + state.time + ')' : '獲取驗(yàn)證碼' }} </a-button> </a-form-model-item> <a-form-model-item prop="password"> <a-input-password v-model="form.password" size="large" placeholder="請輸入密碼" :maxLength="50" /> </a-form-model-item> <a-form-model-item prop="confirmPassword"> <a-input-password v-model="form.confirmPassword" size="large" placeholder="請確認(rèn)密碼" :maxLength="50" /> </a-form-model-item> </a-form-model>
表單參數(shù)校驗(yàn)規(guī)則
rules: { mobile: [{ required: true, validator: this.mobileCheck.bind(this), trigger: ['blur'] }], verificationCode: [{ required: true, message: '請輸驗(yàn)證碼', trigger: ['blur'] }], password: [{ required: true, validator: this.passwordCheck.bind(this), trigger: ['blur'] }], confirmPassword: [{ required: true, validator: this.confirmPasswordCheck.bind(this), trigger: ['blur'] }] } // 手機(jī)號校驗(yàn) mobileCheck(rule, value, callback) { const reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/ if (!value) { callback('請輸入手機(jī)號碼') return } if (!reg.test(value.replace(/(^\s*)|(\s*$)/g, ""))) { callback('請輸入正確手機(jī)號碼') return } callback() } // 密碼校驗(yàn) passwordCheck(rule, value, callback) { const reg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$/ if (!value) { callback('請輸入密碼') return } if (this.form.confirmPassword) { this.$refs.Form.validateField(['confirmPassword']) } if (!reg.test(value)) { callback('密碼必須為8-20位,由數(shù)字和大小寫字母組成') return } callback() } // 再次輸入密碼校驗(yàn) confirmPasswordCheck(rule, value, callback) { let { password } = this.form if (!value) { callback('請?jiān)俅屋斎朊艽a') } if (password) { if (password === value) { callback() } else { callback('兩次輸入密碼不一致,請重新輸入') } } else { callback('請先輸入密碼') } },
參數(shù)校驗(yàn)
使用 validate 對整個表單進(jìn)行校驗(yàn),回調(diào)函數(shù)返回值valid 為true時代表校驗(yàn)通過,false代表校驗(yàn)不通過。
this.$refs.Form.validate(valid => { if (!valid) { // 校驗(yàn)不通過 return } // 校驗(yàn)通過后邏輯 .... })
使用 validateField 對某個表單項(xiàng)進(jìn)行校驗(yàn),當(dāng)回調(diào)函數(shù)返回值valid 為空(‘’)時,表示校驗(yàn)通過,不為空時表示校驗(yàn)不通過。
this.$refs.Form.validateField(['mobile'], valid => { if (valid) { // 校驗(yàn)不通過 return } // 校驗(yàn)通過后邏輯 .... })
使用 validateField 對多個表單項(xiàng)進(jìn)行校驗(yàn)
注意:表單項(xiàng)有幾個,回調(diào)函數(shù)就會執(zhí)行幾次,執(zhí)行順序?yàn)閿?shù)組書寫順序,每次返回對應(yīng)表單項(xiàng)的校驗(yàn)結(jié)果。這樣會導(dǎo)致校驗(yàn)通過后的邏輯執(zhí)行多次。有兩種解決方案:
1、新建數(shù)組arr,回調(diào)函數(shù)每次執(zhí)行時,將結(jié)果push到arr中。 在回調(diào)函數(shù)中對添加判斷邏輯,當(dāng)數(shù)組長度與表單項(xiàng)相等,并且數(shù)組的每一項(xiàng)值都為空(‘’)時,代表校驗(yàn)通過
// 存放每次校驗(yàn)結(jié)果valid let validateFieldList = [] // 校驗(yàn)方法 this.$refs.Form.validateField(['mobile', 'captcha'], valid => { if (!valid) { // 校驗(yàn)通過后,將valid追加入數(shù)組 validateFieldList.push(valid) } // 校驗(yàn)數(shù)組長度與表單項(xiàng)相等,并且數(shù)組的每一項(xiàng)值都為空(‘') if (validateFieldList.length == 2 && validateFieldList.every(item => item === '')) { //校驗(yàn)通過的業(yè)務(wù)邏輯 } // 校驗(yàn)不通過邏輯 return })
2、使用Promise.all()方法,把每個表單項(xiàng)校驗(yàn)封裝為promise函數(shù),所有校驗(yàn)函數(shù)都返回成功后,在執(zhí)行后續(xù)代碼邏輯
// 需要校驗(yàn)的表單項(xiàng) let fileids = ['mobile', 'captcha'] // Promise.all 里面參數(shù)為一個數(shù)組,數(shù)組的每一項(xiàng)是一個返回promise 的函數(shù)調(diào)用 Promise.all(fileids.map(item => new Promise((resolve, reject) => { // 將每次校驗(yàn)結(jié)果返回 this.$refs.Form.validateField(item, err => resolve(err)) }))).then(res => { // then 的第一個參數(shù)是所有promise都成功的調(diào)用,返回結(jié)果是一個數(shù)組,數(shù)組的每一項(xiàng)為函數(shù)promise 的返回結(jié)果 if (res.filter(item => item).length) return // 校驗(yàn)成功后邏輯 })
附:element 中表單 validateField方法部分校驗(yàn)遇到的坑
Step1() { this.$refs.dataForm.validateField(this.field, (valid) => { if (!valid) { // 校驗(yàn)通過進(jìn)行的操作 } }) }, // 多個字段需要校驗(yàn)時候 上面寫法一個字段校驗(yàn)通過即可進(jìn)入if,并沒有校驗(yàn)全部字段,改下面寫法: Step1() { const validateList = [] // 定義空數(shù)組 this.$refs.dataForm.validateField(this.field, (valid) => { // this.field 為要校驗(yàn)的部分rules數(shù)組 validateList.push(valid) }) if (validateList.every((item) => item === '')) { // 判斷全部為空時 進(jìn)行的操作 } },
總結(jié)
到此這篇關(guān)于Vue表單校驗(yàn)validate和validateField的使用及區(qū)別的文章就介紹到這了,更多相關(guān)表單校驗(yàn)validate和validateField使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用vue中的混入mixin優(yōu)化表單驗(yàn)證插件問題
這篇文章主要介紹了使用vue中的混入mixin優(yōu)化表單驗(yàn)證插件,本文是小編給大家總結(jié)的一些表單插件的問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07在vue-cli搭建的項(xiàng)目中增加后臺mock接口的方法
這篇文章主要介紹了在vue-cli搭建的項(xiàng)目中增加后臺mock接口的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04vue完美實(shí)現(xiàn)el-table列寬自適應(yīng)
這篇文章主要介紹了vue完美實(shí)現(xiàn)el-table列寬自適應(yīng),對vue感興趣的同學(xué),可以參考下2021-05-05Vue.js實(shí)現(xiàn)文章評論和回復(fù)評論功能
這篇文章主要為大家詳細(xì)介紹了Vue.js實(shí)現(xiàn)文章評論和回復(fù)評論功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04解決使用vue-awesome-swiper組件手動滾動點(diǎn)擊失效問題
這篇文章主要介紹了使用vue-awesome-swiper組件手動滾動點(diǎn)擊失效問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Vue自定義v-has指令實(shí)現(xiàn)按鈕權(quán)限判斷
這篇文章主要給大家介紹了關(guān)于Vue自定義v-has指令實(shí)現(xiàn)按鈕權(quán)限判斷的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04vue實(shí)現(xiàn)簡單loading進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡單loading進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06