文章首发于 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,校验失败会返回全部失败信息