摘要:文章首發(fā)于已經(jīng)提案很久了,已經(jīng)有過(guò)很大的改動(dòng)。本文基于老的提案實(shí)現(xiàn)。前言有了,我認(rèn)為表單校驗(yàn)方式會(huì)有更多的玩法。所以基于實(shí)現(xiàn)了一個(gè)純凈的對(duì)象校驗(yàn)的庫(kù)。
文章首發(fā)于 shuaizhang.top
Decorator 已經(jīng)提案很久了,已經(jīng)有過(guò)很大的改動(dòng)。本文基于老的提案實(shí)現(xiàn)。
前言有了 Decorator,我認(rèn)為表單校驗(yàn)方式會(huì)有更多的玩法。所以基于 Decorator 實(shí)現(xiàn)了一個(gè)純凈的對(duì)象校驗(yàn)的庫(kù) dvalidator。
在無(wú)任何校驗(yàn)庫(kù)的幫助下,我們可能會(huì)寫出這樣的代碼
let form = { nickname: "", password: "" } function submit() { if (!checkNickName(form.nickname)) { alert("昵稱格式不正確") return } if (!checkPassword(form.password)) { alert("密碼格式不正確") return } remoteValid(form.nickname) .then(() => { // do next }) .catch(() => { alert("昵稱已被注冊(cè)") }) }
使用 dvalidator 我們可以這樣寫
import dvalidator from "dvalidator" let form = { @dvalidator(remoteValid)("昵稱已被注冊(cè)") @dvalidator(checkNickName)("昵稱格式不正確") nickname: "", @dvalidator(checkPassword)("密碼格式不正確") password: "" } function submit() { form .$validate() .then(() => { // do next }) .catch(error => alert(error[0].message)) }Decorator 基礎(chǔ)
“裝飾者模式:在不改變?cè)瓕?duì)象的基礎(chǔ)上,通過(guò)對(duì)其進(jìn)行包裝拓展(添加屬性或者方法)使原有對(duì)象可以滿足用戶的更復(fù)雜需求?!?br>--《JavaScript 設(shè)計(jì)模式》
許多面向?qū)ο蟮恼Z(yǔ)言都有修飾器(Decorator)函數(shù),用來(lái)修改類的行為
可作用于類或?qū)ο笾械膶傩院头椒?/p>
初始化時(shí)從上至下運(yùn)行,執(zhí)行時(shí)從內(nèi)向外
代碼來(lái)源: http://es6.ruanyifeng.com/#docs/decorator#%E6%96%B9%E6%B3%95%E7%9A%84%E4%BF%AE%E9%A5%B0
function dec(id){ console.log("evaluated", id); return (target, property, descriptor) => console.log("executed", id); } class Example { @dec(1) @dec(2) method(){} } // evaluated 1 // evaluated 2 // executed 2 // executed 1使用 dvalidator
使用 dvalidator 校驗(yàn)對(duì)象有這些優(yōu)點(diǎn)
代碼更加直觀,優(yōu)雅,便于后續(xù)維護(hù)
支持異步校驗(yàn):傳遞的校驗(yàn)函數(shù)返回 Promise 即可實(shí)現(xiàn)
按順序校驗(yàn):根據(jù) decorator 執(zhí)行的先后順序
安裝npm install dvalidator --save
npm install @babel/plugin-proposal-decorators --save-dev使用
配置 babel
plugins: [ [ "@babel/plugin-proposal-decorators", { legacy: true } ] ]原理
為對(duì)象增加 __rules 屬性,并不可枚舉,配置,寫
rules的屬性與obj屬性一一對(duì)應(yīng)
每申明一個(gè)Decorator,其實(shí)都是更新 __rules 屬性
調(diào)用 $validate 時(shí),會(huì)根據(jù) rules 對(duì)整個(gè)對(duì)象進(jìn)行校驗(yàn),返回 Promise,校驗(yàn)失敗會(huì)返回所有失敗信息
參考http://es6.ruanyifeng.com/#do...
https://github.com/yiminghe/a...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/104807.html
摘要:中基于的自動(dòng)實(shí)體類構(gòu)建與接口文檔生成是筆者對(duì)于開源項(xiàng)目的描述,對(duì)于不反感使用注解的項(xiàng)目中利用添加合適的實(shí)體類或者接口類注解,從而實(shí)現(xiàn)支持嵌套地實(shí)體類校驗(yàn)與生成等模型生成基于的接口文檔生成等等功能。 JavaScript 中基于 swagger-decorator 的自動(dòng)實(shí)體類構(gòu)建與 Swagger 接口文檔生成是筆者對(duì)于開源項(xiàng)目 swagger-decorator 的描述,對(duì)于不反感使...
摘要:最近新開了一個(gè)項(xiàng)目,采用來(lái)開發(fā),在數(shù)據(jù)庫(kù)及路由管理方面用了不少的裝飾器,發(fā)覺這的確是一個(gè)好東西。在中的使用該裝飾器會(huì)在定義前調(diào)用,如果函數(shù)有返回值,則會(huì)認(rèn)為是一個(gè)新的構(gòu)造函數(shù)來(lái)替代之前的構(gòu)造函數(shù)。函數(shù)參數(shù)裝飾器最后,還有一個(gè)用于函數(shù)參 最近新開了一個(gè)Node項(xiàng)目,采用TypeScript來(lái)開發(fā),在數(shù)據(jù)庫(kù)及路由管理方面用了不少的裝飾器,發(fā)覺這的確是一個(gè)好東西。 裝飾器是一個(gè)還處于草案中...
摘要:在深入技術(shù)棧一書中,提到了基于的。書里對(duì)基于的沒有給出完整的實(shí)現(xiàn),在這里實(shí)現(xiàn)并記錄一下實(shí)現(xiàn)的思路。在這里最小的組件就是。對(duì)比范式與父組件的范式,如果完全利用來(lái)實(shí)現(xiàn)的,將操作與分離,也未嘗不可,但卻不優(yōu)雅。 在深入react 技術(shù)棧一書中,提到了基于Decorator的HOC。而不是直接通過(guò)父組件來(lái)逐層傳遞props,因?yàn)楫?dāng)業(yè)務(wù)邏輯越來(lái)越復(fù)雜的時(shí)候,props的傳遞和維護(hù)也將變得困難且冗...
摘要:為了代碼進(jìn)一步解耦,可以考慮使用高階組件這種模式。開源的高階組件使用提供了一系列使用的高階組件,可以增強(qiáng)組件的行為,可以利用此庫(kù)學(xué)習(xí)高階組件的寫法。通過(guò)使用此庫(kù)提供的高階組件,可以方便地讓列表元素可拖動(dòng)。 1. Decorator基本知識(shí) 在很多框架和庫(kù)中看到它的身影,尤其是React和Redux,還有mobx中,那什么是裝飾器呢。 修飾器(Decorator)是一個(gè)函數(shù),用來(lái)修改類的...
摘要:描述符必須是這兩種形式之一不能同時(shí)是兩者??梢允侨魏斡行У闹禂?shù)值,對(duì)象,函數(shù)等。當(dāng)且僅當(dāng)該屬性的為時(shí),才能被賦值運(yùn)算符改變。特點(diǎn)就是不影響之前對(duì)象的特性,而新增額外的職責(zé)功能。 前言 原文鏈接:[Nealyang/personalBlog]() showImg(https://segmentfault.com/img/remote/1460000018958861); ES6 已經(jīng)不必...
閱讀 647·2021-11-24 09:39
閱讀 3489·2019-08-30 15:53
閱讀 2529·2019-08-30 15:44
閱讀 3247·2019-08-30 12:54
閱讀 2216·2019-08-29 12:23
閱讀 3312·2019-08-26 14:05
閱讀 2113·2019-08-26 13:36
閱讀 3445·2019-08-26 13:33