Vue自定義表單內(nèi)容檢查rules實例
先看個例子
組件
<el-form-item label="手機號:" prop="phone_number"> <el-input v-model="formPerson.phone_number"></el-input> </el-form-item>
script中
export default {
data() {
var validateMobilePhone = (rule, value, callback) => {
if (value === '') {
callback(new Error('負責人手機號不可為空'));
} else {
if (value !== '') {
var reg = /^1[3456789]\d{9}$/;
if (!reg.test(value)) {
callback(new Error('請輸入有效的手機號碼'));
} else {
callback();
}
}
}
};
return{
formPerson: {
phone_number: '',
},
rules: {
phone_number: [
{validator: validateMobilePhone, trigger: 'blur'}
]
},
}
}
}
遇到的坑
在組件中【開始寫的時候prop自定的名字】
<el-form-item label="手機號:" prop="phone"> <el-input v-model="formPerson.phone_number"></el-input> </el-form-item>
rules中
rules: {
phone: [
{validator: validateMobilePhone, trigger: 'blur'}
]
}
碰到的坑
當輸入正確的手機號時,顯示為錯誤,發(fā)現(xiàn)value并沒有傳過來,為undefined
解決:
prop寫成和數(shù)據(jù)中的參數(shù)的名稱一樣,即phone_number
補充知識:用vue自定義指令v-validated寫一個全局表單驗證
由于不想在單vue文件里用blur等等設置表單驗證并顯示驗證失敗的信息,因此思考并封裝了一個全局自定義指令。
獻上我的代碼。
html
<div class="form-section">
<p>First Name</p>
<input type="text" v-model='form.username' v-validated:username="['username',form.username]" placeholder="" >
<div class="error"></div>
</div>
<div class="form-section">
<p>Last Name</p>
<input type="text" v-model='form.secondname' placeholder="">
<div class="error"></div>
</div>
<div class="form-section">
<p>Email</p>
<input type="email" v-model='form.email' v-validated:email="['email',form.email]" placeholder="">
<div class="error"></div>
</div>
<div class="form-section">
<p>Password</p>
<input type="password" v-model='form.password' v-validated:password="['password',form.password]" autocomplete placeholder="">
<div class="error"></div>
</div>
在input上掛載v-validated指令,向指令傳輸 ‘username'的校驗類型,和form.username的校驗數(shù)據(jù)。
現(xiàn)在封裝v-validated指令
validated.js
import Vue from 'vue'
/**
* 校驗失敗
*/
function testError (el) {
el.style.borderColor = '#d20000'
el.style.backgroundColor = '#fff8f8'
}
/**
* 校驗成功
*/
function testCorrect (el) {
el.style.borderColor = '#a3a3a3'
el.nextElementSibling.innerHTML = ''
el.style.backgroundColor = 'transparent'
}
/**
* 校驗用戶名
* */
function testUserName (username, el) {
if (/^\w{3,30}$/g.test(username)) {
testCorrect(el)
return true
} else {
testError(el)
el.nextElementSibling.innerHTML = 'Username must be 3 to 30 characters'
return false
}
}
/**
* 校驗郵箱
* */
function testEmail (email, el) {
if (/^[\w-]+@[\w-]+(\.[\w-]+)+$/g.test(email)) {
testCorrect(el)
return true
} else {
testError(el)
el.nextElementSibling.innerHTML = 'Mailbox format is not correct!'
return false
}
}
/**
* 校驗密碼
* */
function testPwd (pwd, el) {
if (/^\w{6,30}$/g.test(pwd)) {
testCorrect(el)
return true
} else {
testError(el)
el.nextElementSibling.innerHTML = 'Password must be 6 to 30 characters'
return false
}
}
Vue.directive('validated', {
inserted (el, binding) { // 綁定元素插入父節(jié)點時調(diào)用
el.addEventListener('blur', () => {
switch (binding.value[0]) {
case 'username' : testUserName(binding.def[binding.rawName], el); break
case 'email' : testEmail(binding.def[binding.rawName], el); break
case 'password' : testPwd(binding.def[binding.rawName], el); break
}
})
},
update: function (el, binding, vNode) { // 更新元素信息時調(diào)用
binding.def[binding.rawName] = binding.value[1]
}
})
export default {
init () {
console.log('*** validated installed ***')
}
}
由于沒有找到官方鉤子之間傳遞數(shù)據(jù)的方法,所以自己看著用binding.def下定義updated來作為傳遞數(shù)據(jù),
inserted是節(jié)點插入時就調(diào)用一次。在這里做元素blur的監(jiān)聽,動態(tài)數(shù)據(jù)由update刷新。
修正:我只定義一個updated會出現(xiàn)多個更新數(shù)據(jù)共用一個參數(shù)名,導致數(shù)據(jù)錯亂。
所以我用binding.rawName做指針,放入binding.def下,實現(xiàn)一個頁面多個數(shù)據(jù)多個處理,因為update鉤子是頁面上的任意改動都會觸發(fā),而不是當前掛載指令的dom對象變化才會跟著變化。
最后將這個文件放入main.js
main.js
import validated from '@/dorajs/validated.js'
Vue.use(validated)
效果如下



完美解決!
以上這篇Vue自定義表單內(nèi)容檢查rules實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue?實現(xiàn)列表跳轉(zhuǎn)至詳情且能添加至購物車功能
列表頁面顯示數(shù)據(jù),點擊跳轉(zhuǎn)到對應的詳情頁,詳情頁可以添加并跳轉(zhuǎn)到購物車,購物車具有常見功能,這篇文章主要介紹了vue?實現(xiàn)列表跳轉(zhuǎn)至詳情且能添加至購物車,需要的朋友可以參考下2022-10-10
vue 插值 v-once,v-text, v-html詳解
這篇文章主要介紹了vue 插值 v-once,v-text, v-html詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
vue+echarts實現(xiàn)中國地圖流動效果(步驟詳解)
這篇文章主要介紹了vue+echarts實現(xiàn)中國地圖流動效果(步驟詳解),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
vue3+vite+vant4手機端項目實戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于vue3+vite+vant4手機端項目實戰(zhàn)的相關(guān)資料,Vue3是一種前端開發(fā)框架,它的目標是提供更好的性能和開發(fā)體驗,需要的朋友可以參考下2023-08-08

