背景:開發中遇到的表單輸入,往往會有對輸入內容的限制,比如不能輸入表情和特殊字符,只能輸入數字或字母等。
我們常規方法是在每一個表單的 on-change
事件上做處理。
1 <template> 2 <input type="text" v-model="note" @change="vaidateEmoji" /> 3 </template> 4 5 <script> export default { 6 methods: { 7 vaidateEmoji() { 8 var reg = /[^u4E00-u9FA5|d|a-zA-Z|rns,.?!,。?!…—&$=()-+/*{}[]]|s/g 9 this.note = this.note.replace(reg, '') 10 }, 11 }, 12 } 13 </script>
這樣代碼量比較大而且不好維護,所以我們需要自定義一個指令來解決這問題。
需求:根據正則表達式,設計自定義處理表單輸入規則的指令,下面以禁止輸入表情和特殊字符為例。
1 let findEle = (parent, type) => { 2 return parent.tagName.toLowerCase() === type ? parent : parent.querySelector(type) 3 } 4 5 const trigger = (el, type) => { 6 const e = document.createEvent('HTMLEvents') 7 e.initEvent(type, true, true) 8 el.dispatchEvent(e) 9 } 10 11 const emoji = { 12 bind: function (el, binding, vnode) { 13 // 正則規則可根據需求自定義 14 var regRule = /[^u4E00-u9FA5|d|a-zA-Z|rns,.?!,。?!…—&$=()-+/*{}[]]|s/g 15 let $inp = findEle(el, 'input') 16 el.$inp = $inp 17 $inp.handle = function () { 18 let val = $inp.value 19 $inp.value = val.replace(regRule, '') 20 21 trigger($inp, 'input') 22 } 23 $inp.addEventListener('keyup', $inp.handle) 24 }, 25 unbind: function (el) { 26 el.$inp.removeEventListener('keyup', el.$inp.handle) 27 }, 28 } 29 30 export default emoji
使用:將需要校驗的輸入框加上 v-emoji
即可
1 <template> 2 <input type="text" v-model="note" v-emoji /> 3 </template>