文章首發於 shuaizhang.topgit
Decorator 已經提案好久了,已經有過很大的改動。本文基於老的提案實現。es6
有了 Decorator,我認爲表單校驗方式會有更多的玩法。因此基於 Decorator 實現了一個純淨的對象校驗的庫 dvalidator。
在無任何校驗庫的幫助下,咱們可能會寫出這樣的代碼github
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('暱稱已被註冊') }) }
使用 dvalidator 咱們能夠這樣寫npm
import dvalidator from 'dvalidator' let form = { @dvalidator(remoteValid)('暱稱已被註冊') @dvalidator(checkNickName)('暱稱格式不正確') nickname: '', @dvalidator(checkPassword)('密碼格式不正確') password: '' } function submit() { form .$validate() .then(() => { // do next }) .catch(error => alert(error[0].message)) }
「裝飾者模式:在不改變原對象的基礎上,經過對其進行包裝拓展(添加屬性或者方法)使原有對象能夠知足用戶的更復雜需求。」
--《JavaScript 設計模式》
代碼來源: 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 校驗對象有這些優勢bash
npm install dvalidator --save
npm install @babel/plugin-proposal-decorators --save-dev
配置 babelbabel
plugins: [ [ '@babel/plugin-proposal-decorators', { legacy: true } ] ]
__rules
屬性,並不可枚舉,配置,寫__rules
屬性$validate
時,會根據 rules 對整個對象進行校驗,返回 Promise,校驗失敗會返回全部失敗信息