import { Validate } from 'validate'; const validate = new Validate(); export interface FormOption { checkDelay?:number } export interface FormCheckData { key? value } export interface FormCheckRes { info errors rights values passed: boolean } export abstract class BaseFormValidate { constructor ( public checkOptions, public option: FormOption = {} ) {} timer cache:any = {} // == 检查值 checkValue = (data:FormCheckData):Promise => { const { key, value } = data; let checkRes; if(typeof value === 'object'){ checkRes = validate.check(value, this.checkOptions) }else if(this.checkOptions[key]){ checkRes = validate.check({[key]: value}, {[key]: this.checkOptions[key]}); }else{ checkRes = {}; } delete checkRes.passedAll; this.cache = Object.assign({}, this.cache, checkRes); // 输出100ms防抖 return new Promise((resolve) => { clearTimeout(this.timer); this.timer = setTimeout(() => { const output = this.handleResult(this.cache); resolve(output); }, this.option.checkDelay || 100); }); } // == 处理结果 handleResult = (cache):FormCheckRes => { // 各字段信息汇总,如错误信息,检测格式,修正前后值 let info = {}, errors = {}, values= {}, rights = {}; let passed = true; for (let k of Object.keys(cache)){ const res = cache[k]; if(!res) continue; values[k] = res.value; if(res.passed) { rights[k] = true; } else { errors[k] = res.errors[0].message; passed = false; } info[k] = { passed: res.passed, format: res.format, value: res.value, rValue: res.rValue // 修正值 }; if(!res.passed) info[k].message = errors[k]; } return { info, values, errors, rights, passed }; } // == 清理缓存 clear = (key) => { if(key){ delete this.cache[key]; }else{ clearTimeout(this.timer); this.timer = null; this.cache = {}; } } }