亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用vue自定義指令開發表單驗證插件validate.js

2019-11-19 11:28:50
字體:
來源:轉載
供稿:網友

這段時間在進行一個新項目的前期搭建,新項目框架采用vue-cli3和typescirpt搭建。因為項目比較輕量,所以基本沒有使用額外的ui組件,有時候我們需要的一些基礎組件我就直接自己開發了。今天就來介紹一下如何利用vue的自定義指令directive來開發一個表單驗證插件的過程。

1.vue插件開發

關于vue的插件開發,官方文檔里有很清晰的說明,詳情可以去閱讀開發文檔。我自己開發的表單驗證插件validate.ts和loading,messageBox插件都是利用了這種方式。今天先來看表單驗證插件的開發。

vue全局指令

// myPlugin.jsexport default { install: (Vue, options) => { // 注冊一個my-directive指令 Vue.directive('my-directive', {  bind(el, binding, vnode, oldVnode) {  // 邏輯  }  ... }) }}// main.jsimport Vue from 'vue';import myPlugin from 'myPlugin';Vue.use(myPlugin);

上面是注冊一個vue指令插件的寫法。值得注意的是注冊自定義指令的時候,bind()函數為指令的鉤子函數,其中的參數el表示指令綁定的元素,可以直接操作DOM。binding表示一個對象,包括指令名稱,綁定值等信息。vnode和oldVnode表示Vue編譯生成的虛擬節點。

我們通過注冊一個全局指令v-validateParams指令,綁定到輸入表單的input標簽上來校驗當前輸入值是否符合要求。

2.v-validateParams指令

最開始我參考了網上的一些代碼?;A的實現如下:

整體框架

import Vue from 'vue'export default { install: (Vue, options) => { // 注冊一個全局自定義指令 `v-validateParams` Vue.directive('validateParams', {  // 當被綁定的元素插入到 DOM 中時  inserted: function (el, binding, vNode) {  // 給指令綁定的Dom元素添加事件監聽,監測輸入框失焦事件  // 每次當表單中的輸入框失焦時執行函數  el.addEventListener('blur', function (event) {   // 1.首先重置所有錯誤提示   // 2.獲取自定義指令中傳入的校驗規則參數和表單輸入的值   // 3.依次判斷當前輸入的值是否符合校驗規則  })  } }) // 注冊一個全局自定義指令 `v-validateSubmit`,這個指令綁定到表單的提交button上 Vue.directive('validateSubmit', {  // 當被綁定的元素插入到 DOM 中時  inserted: function (el, binding, vNode) {  // 給提交button添加事件監聽  el.addEventListener('click', function (event) {   // 獲取當前組件內所有含有v-check類名的元素   let elements = vNode.context.$el.getElementsByClassName('v-check')   var evObj = vNode.context.$el.createEvent('Event')   evObj.initEvent('blur', true, true)   for (let element of elements) {   // 給所有v-check元素綁定blur事件   element.dispatchEvent(evObj);   }   // 獲取當前組件下的所有錯誤提示元素   let errorInputs = vNode.context.$el.getElementsByClassName('input-error');   // 如果組件中沒有錯誤提示元素,則執行當前組件實例中的submit()函數   if(errorInputs.length === 0){   vNode.context.submit();   }  })  } }) }}

這里需要著重說明一下 validateSubmit 指令,這個指令綁定到提交按鈕上,在點擊的時候執行校驗,校驗通過之后執行提交操作。但是這里的實現方式不是特別友好:

1.需要獲取當前組件中的所有input元素,給他們綁定并執行 blur 事件,以此來執行 validateParams 指令中的校驗邏輯。

2.需要獲取當前組件中的所有錯誤提示元素,如果他們存在就不能執行提交操作。

3.當組件內不含任何錯誤提示元素時,就表示校驗通過,執行當前組件內的 submit 函數,所以每個表單組件的提交函數都只能命名為 submit

然后我們再看下指令 validateParams ,該指令需要綁定到表單 input 元素上,并把校驗規則當作參數寫入。當該input元素失焦時,會執行指令中給當前元素綁定的事件中的邏輯。這些邏輯分為三個步驟,我已經寫在注釋里了,現在我們來看下具體實現。

重置所有錯誤提示

/** * 重置當前節點樣式 * @param el: HTMLElement,傳入當前綁定的input元素 */const resetError = (el: HTMLElement) => { el.className = el.className.replace('input-error', '').trim(); if ( el.parentNode ) { const ErrorNode = el.parentNode.querySelector('.error-tips'); if (ErrorNode) {  el.parentNode.removeChild(ErrorNode); } }};

獲取自定義指令中傳入的校驗規則參數和表單輸入的值

// binding.value是傳入自定義指令的參數,以數組的形式for (const rule of binding.value) { // 分別獲取到自己定義的校驗規則并執行 const { min, max, message, required, pattern } = rule; if ( min && InputEl.value.length < min ) { // 如果不符合校驗,執行報錯函數 validateError(InputEl, message); break; } if ( max && InputEl.value.length > max ) { validateError(InputEl, message); break; } if ( !!required && !InputEl.value ) { validateError(InputEl, message); break; } if ( pattern && !pattern.test(InputEl.value) ) { validateError(InputEl, message); break; } if ( rule && typeof rule === 'function' ) { rule(vNode.context, InputEl.value, validateError, InputEl); break; }}

校驗不符合,執行報錯函數

/** * 執行錯誤提示函數,用input-error 類名和含有錯誤信息的p元素表示未通過校驗 * @param el: HTMLElement,傳入當前綁定的input元素 * @param errorMsg: string,傳入錯誤提示信息 */const validateError = (el: HTMLElement, errorMsg: string) => { if (Array.prototype.includes.call(el.classList, 'input-error')) { //如果當前組件里已經有了錯誤提示信息,什么也不做 return; } else { const errorNode = document.createElement('p'); errorNode.className = 'error-tips'; errorNode.textContent = errorMsg; if (el.parentNode) {  // 在當前input 元素后追加一個p元素,內容為錯誤提示  el.parentNode.appendChild(errorNode); } // 在當前input 元素上添加一個input-error類名 el.className += ' input-error'; }};

現在我就把自己實現的這個表單校驗插件大致說完了,下面我們看下具體使用。

3.自定義校驗指令v-validateParams使用

首先新建校驗規則文件:

// rules.tsexport const required = (message) => ({ message, required: true});export const min = (message, length=3) => ({ message, min: length})export const max = (message, length=15) => ({ message, max: length})export const pattern = (message, reg) => ({ message, pattern: reg})// form.vue<template> <div> <div class="form-item">  <label for="userEmail">用戶名:</label>  <input id="userEmail" class='v-check' type="text" v-model="userName"  v-validateParams="[inputNameRequired, inputNameMin, inputNameMax, inputNamePattern]"> </div> <button class="btn" v-if="show" type="success" v-checkSubmit>確認</button> </div></template><script lang='ts'>import { Component, Vue, Prop } from 'vue-property-decorator';import { max, min, required, name, pattern} from 'rules';@Component({ components: {},})export default class Auth extends Vue { private show: boolean = true; private userName: string = ''; private inputNameMax = max('請不要超過20個字符'); private inputNameMin = min('請不要小于3個字符'); private inputNameRequired = required('請輸入用戶名'); private inputNamePattern = pattern('請輸入符合要求的用戶名', /^[a-zA-Z0-9_-]{4,16}$/); private submit() { alert('通過校驗'); }}</script>

通過這個例子我們可以看到,使用時需要將校驗規則引入并賦給vue實例中的數據。然后在模板中,需要給 input 標簽添加 v-check 類名,再使用 v-validateParams 指令,并傳入參數。提交按鈕需要調用 v-checkSubmit 指令。按照這種方式就能夠使用自己開發的這個表單校驗插件。

3. 當前方式存在的問題

雖然表單校驗可以使用了,但是存在一些顯而易見的問題:

1.js和html耦合度較高,插件還需要獲取dom元素,組件的html模板中還需要添加指定的類名。

2.在vue中使用dom操作,不符合vue的設計思路,實現方式也不優雅。

3.校驗規則的校驗邏輯在指令定義時寫定了,添加或刪除都需要改動插件代碼。

4.提交指令根據當前組件內的是否含有特定dom來判斷當前校驗狀態,且執行提交的函數名稱也在指令邏輯中寫定了。

我根據現有一個demo結合著自己的需求來實現的這個表單校驗插件,開發的過程中我已經知道這么寫問題很多,甚至不能稱之為一個合格的插件。同時也清楚的認識到自己的javascript水平還很初級,需要很大進步。

當前開發的表單插件的主要問題在于如何將插件中的校驗狀態返回到組件內。我們可以在插件內維護一個事件處理函數,將校驗規則傳入并校驗,再將校驗結果直接傳給組件內。這樣就可以避免大量的dom操作。之后我需要盡快對這個插件進行更科學合理的重構。

總結

以上所述是小編給大家介紹的使用vue自定義指令開發表單驗證插件validate.js,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲自拍欧美色图| 欧美老肥婆性猛交视频| 欧美天堂在线观看| 亚洲天堂成人在线| 日韩欧美综合在线视频| 亚洲影院色无极综合| 亚洲欧美中文另类| 在线播放国产一区中文字幕剧情欧美| 欧美福利视频在线| 日韩中文字幕在线看| 国产精品久久久久久久久久小说| 成人黄色网免费| 成人h视频在线观看播放| 久99九色视频在线观看| 国产精品情侣自拍| 91精品国产777在线观看| 韩国三级电影久久久久久| 国产一区二区三区在线看| 欧美一级电影久久| 欧美亚洲视频在线观看| 亚洲丝袜av一区| 午夜精品国产精品大乳美女| 亚洲国产精品va在线看黑人| 久久久久国色av免费观看性色| 国产日韩av在线播放| 69久久夜色精品国产7777| 97福利一区二区| 成人激情在线观看| 国产专区欧美专区| 一区二区欧美亚洲| 日韩激情视频在线| 国产视频精品xxxx| 亚洲第一网站免费视频| 亚洲日本aⅴ片在线观看香蕉| 日韩美女视频中文字幕| 亚洲天堂影视av| 96国产粉嫩美女| 91在线视频成人| 亚洲国产欧美在线成人app| 亚洲精品国产精品久久清纯直播| 国产亚洲a∨片在线观看| 精品亚洲一区二区三区在线播放| 国产成人av在线| 一区二区三区回区在观看免费视频| 亚洲电影免费观看高清完整版| 国产日韩欧美电影在线观看| 欧美在线一区二区视频| 亚洲xxx视频| 亚洲综合中文字幕在线| 中文字幕在线亚洲| 欧美激情一区二区三级高清视频| 欧美巨乳美女视频| 国产午夜精品全部视频在线播放| 不卡av日日日| 亚洲一区二区精品| 亚洲人成网站色ww在线| 国内精品中文字幕| 亚洲国产精品电影| 亚洲精品不卡在线| 中文字幕精品影院| 亚洲乱码国产乱码精品精| 中文字幕一区二区精品| 亚洲成年人影院在线| 亚洲91精品在线观看| 国产一区二区在线免费| 91精品啪在线观看麻豆免费| 久久综合色88| 亚洲成人av片| 日韩在线观看免费全集电视剧网站| 国产在线视频不卡| 欧洲中文字幕国产精品| 日韩成人av一区| 国产精品亚洲片夜色在线| 96sao精品视频在线观看| 欧美超级免费视 在线| 7777kkkk成人观看| 一区二区成人精品| 68精品国产免费久久久久久婷婷| 91在线|亚洲| 国产精品福利观看| 欧美性猛交xxxx| 亚洲欧美国产制服动漫| 久久天天躁日日躁| 九九热这里只有在线精品视| 欧美xxxx综合视频| 色综合久久88| 在线亚洲午夜片av大片| 136fldh精品导航福利| 欧美激情亚洲国产| 国产精品日日做人人爱| 日本高清视频精品| 久久国产精品久久久久久久久久| 国产欧美日韩专区发布| 日韩精品中文字幕在线观看| 美女久久久久久久| 国产日韩欧美中文| 日韩成人中文字幕| 久久成人一区二区| 国产成人精品网站| 亚洲国产小视频在线观看| 欧美激情小视频| 成人性生交xxxxx网站| 国产成人+综合亚洲+天堂| 国产精品成人一区二区| 日韩av中文字幕在线免费观看| 性色av一区二区咪爱| 国产精品69久久久久| 久久青草精品视频免费观看| 欧美视频裸体精品| 狠狠综合久久av一区二区小说| 亚洲人成网站免费播放| 国产+成+人+亚洲欧洲| 精品国偷自产在线视频| 国产综合福利在线| 国产成人小视频在线观看| 国产日本欧美一区| 亚洲日韩欧美视频一区| 久久激情视频久久| 亚洲老板91色精品久久| 久久久国产一区二区| 国产精品自产拍在线观看中文| 911国产网站尤物在线观看| 国产精品综合网站| 国产亚洲日本欧美韩国| 亚洲欧美精品在线| 精品国产电影一区| 欧美成人亚洲成人日韩成人| 亚洲精品免费网站| 18一19gay欧美视频网站| 在线观看日韩视频| 高跟丝袜欧美一区| 伊人久久五月天| 欧美日韩美女在线观看| 最近中文字幕2019免费| 国产欧美日韩免费看aⅴ视频| www日韩欧美| 成人有码视频在线播放| 国产一区二区av| 国内精品免费午夜毛片| 97久久超碰福利国产精品…| 亚洲国产精品久久久久| 毛片精品免费在线观看| 亚洲人精选亚洲人成在线| 91久久久久久久久久| 亚洲福利视频在线| 欧美专区福利在线| 81精品国产乱码久久久久久| 国产精品永久免费视频| 九九综合九九综合| 亚洲欧美日韩视频一区| 亚洲一区制服诱惑| 国产成人综合一区二区三区| 夜夜嗨av色综合久久久综合网| 91久久国产婷婷一区二区| 日韩av在线网页| 亚洲香蕉在线观看| 91高清视频在线免费观看| 日韩av电影中文字幕| 久久久国产精品视频| 成人97在线观看视频| 北条麻妃久久精品| 亚洲缚视频在线观看| 欧美午夜精品久久久久久人妖| 欧美一级在线播放|