摘要:每一個項目,都要重寫驗證規(guī)則,驗證邏輯,那感覺簡直想屎。自從遇見了策略者模式,產(chǎn)經(jīng)你不是要加驗證嗎沒問題。這個驗證規(guī)則不行,替換沒問題。你這只是一對多的驗證規(guī)則,當(dāng)我要提交表單的時候,我還有其他的都需要驗證呢。
策略者模式
還在為你表單驗證頭疼嗎?還在為產(chǎn)經(jīng)無理取鬧,要你每個輸入框都加驗證而感到煩惱嗎?還在忙于復(fù)制粘貼驗證規(guī)則而感到厭煩嗎? 那么策略者模式是最適合你的。
What are u talking about?
上面其實是我的切身體會,我也相信有許許多多的font-end踩過這個坑。每一個項目,都要重寫驗證規(guī)則,驗證邏輯,那感覺簡直想屎。自從遇見了策略者模式,產(chǎn)經(jīng)你不是要加驗證嗎?沒問題。 這個驗證規(guī)則不行,替換~ 沒問題。這里需要多加一個驗證規(guī)則,沒問題。
我想我們以前寫代碼會是這樣的
var username = document.querySelector("username").value; var reg = /w+/; if(username.length===0||username==null){ alert("用戶名不能為空!"); }else if(!reg.test(username)){ alert("用戶名格式不正確!"); } ...
這種書寫不是不好,只是重用性...so bad.
我們來看看策略者模式怎樣寫的。
首先驗證部分
var validate = (function(){ var instructions = { notEmpty:"不能為空!", isPhone:"手機號不正確!" }; var types = { notEmpty:function(value){ if(value==null||value.length===0){ return false; } return true; }, isPhone:function(value){ var reg = /d+/; if(reg.test(value)){ return true; } return false; } } return function(value,type){ //type為檢測類型,value為檢測的值 if(!types[type]){ throw "檢測類型不存在"; } if(!types[type](value)){ return instructions[type]; } return false; } })(); //測試 console.log(validate("","notEmpty")); // "不能為空!"
完美~
屁~
仔細(xì)觀察不難發(fā)現(xiàn),就是對一個輸入不能驗證多個內(nèi)容. 那怎么滿足這個需求呢? 還得寫一個檢測類,相當(dāng)于代理。
//返回多個檢測的結(jié)果,如果驗證都通過則返回空的數(shù)組 var detect = function(value,types){ var result = []; if(!(types instanceof Array)){ //這里只是做類型檢測,萬一手賤輸錯了就不好了 throw "檢測類型需要為數(shù)組不正確"; } for(var type of types){ var msg = validate(value,type); if(msg){ //如果信息存在 result.push(msg); } } return result.length?result:false; } console.log(detect("",["notEmpty"]));
恩恩,這應(yīng)該可以了吧。
NO NO NO ~~~
你這只是一對多的驗證規(guī)則,當(dāng)我要提交表單的時候,我還有其他的value都需要驗證呢。你有沒有多對多的檢測類。
有的,客官~
//總的代碼如下,如果有興趣可以拷貝測試一下。
var validate = (function(){ var instructions = { notEmpty:"不能為空!", isPhone:"手機號不正確!" }; var types = { notEmpty:function(value){ if(value==null||value.length===0){ return false; } return true; }, isPhone:function(value){ var reg = /d+/; if(reg.test(value)){ return true; } return false; } } return function(value,type){ //type為檢測類型,value為檢測的值 if(!types[type]){ throw "檢測類型不存在"; } if(!types[type](value)){ return instructions[type]; } return false; } })(); var Detect = function(){ this.result = []; } Detect.prototype.add = function(value,types){ if(!(types instanceof Array)){ throw "檢測類型只能為數(shù)組"; } for(var type of types){ var msg = validate(value,type); if(!!msg){ this.result.push(msg); } } } Detect.prototype.getResult = function(){ var result = this.result; return result.length?result:false; } var detect = new Detect(); detect.add("",["notEmpty"]); //添加值的驗證 detect.add(123,["isPhone"]); //添加另外一個值的驗證 console.log(detect.getResult()); //["不能為空"]
恩~ 可以了~
如果大家領(lǐng)悟的話,可以自己寫一個策略者模式的表單檢測。前端最好的學(xué)習(xí)方式就是看書加實踐(造輪子).
如果還沒的話,那就收藏下,萬一哪天想通了呢?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78466.html
摘要:更新說明優(yōu)化提升接口開發(fā)體驗集成參數(shù)驗證及接口測試文檔自動生成一設(shè)置文檔標(biāo)題設(shè)置文檔頭部標(biāo)題和版本號一個項目只定義一次即可二為類設(shè)置名稱默認(rèn)文檔左側(cè)導(dǎo)航類的名稱定義在類的注釋中三接口定義在方法體定義獲取框架當(dāng)前版本號由三部分組成允許訪問的請 1.5.8 更新說明 Skeleton優(yōu)化 提升接口開發(fā)體驗, 集成參數(shù)驗證及接口測試文檔自動生成 一, 設(shè)置文檔標(biāo)題 @cp_doc_info...
摘要:本項目是一個簡單的全棧項目,前端新手可以拿來練練手。項目實現(xiàn)了一些簡單的功能,后臺可以對圖書進(jìn)行錄入錄出掃碼或手動,前臺顯示錄入的圖書,并且前臺注冊登錄后可以將書的訂單發(fā)給服務(wù)器,并存到服務(wù)器。 Vue-book 2.0 Github 地址:https://github.com/percy507/v... 【覺得不錯就來個 star 吧 ^_^】 說明(菜鳥請進(jìn),大神繞道 ~) 前端...
摘要:本項目是一個簡單的全棧項目,前端新手可以拿來練練手。項目實現(xiàn)了一些簡單的功能,后臺可以對圖書進(jìn)行錄入錄出掃碼或手動,前臺顯示錄入的圖書,并且前臺注冊登錄后可以將書的訂單發(fā)給服務(wù)器,并存到服務(wù)器。 Vue-book 2.0 Github 地址:https://github.com/percy507/v... 【覺得不錯就來個 star 吧 ^_^】 說明(菜鳥請進(jìn),大神繞道 ~) 前端...
摘要:我就是一游客系統(tǒng)獲取我的信息拿到權(quán)限值動態(tài)加載路由通行不是。。我是權(quán)限汪等等我看看作者有沒有把你降級沒有好了。。你還是權(quán)限汪請進(jìn)有滾吧你已經(jīng)不是權(quán)限汪了作者已經(jīng)把你寫成戰(zhàn)斗力只有的渣渣了沒有沒有還敢闖這里滾去關(guān)口沒錯,就這么簡單。 大體流程 參考資料: nx-admin項目地址 首先這里就不講解vue和vuex之類的基礎(chǔ)東西了 有興趣的可以去官方文檔了解。這里根據(jù)流程走向大概說說 路由...
閱讀 2234·2019-08-30 15:53
閱讀 2463·2019-08-30 12:54
閱讀 1208·2019-08-29 16:09
閱讀 734·2019-08-29 12:14
閱讀 761·2019-08-26 10:33
閱讀 2486·2019-08-23 18:36
閱讀 2962·2019-08-23 18:30
閱讀 2125·2019-08-22 17:09