源码分析——async-validator
async-validator 的优势
async-validator 是一款基于 TypeScript 开发的用于表单校验库。它可以用于验证 Vue、React 等前端框架中的表单数据。该库具有以下几个优点:
- 强大的验证功能:async-validator 支持各种常见的验证规则,如必填、最小值、最大值、长度、正则等,同时也支持自定义验证规则,可以满足不同的验证需求。
- 异步验证:async-validator 支持异步验证,可以用于处理一些需要从后台获取数据后才能进行验证的场景。
- 灵活性:async-validator 同时支持单个字段和多个字段的验证,可以通过配置来指定需要验证的字段和验证规则,这种灵活性能够满足各种不同的验证需求。
- 易用性:async-validator 使用简单,只需要引入库文件后,通过调用相应的方法就可以完成表单验证。
- 可扩展性:async-validator 的验证规则是可以扩展的,可以通过编写自定义验证规则来实现更复杂的验证功能。
async-validator 如何产生优势
下面的代码摘自 async-validator 仓库中的 README.md,这段代码展示了 async-validator 的核心概念。
import Schema from 'async-validator';
const descriptor = {
name: {
type: 'string',
required: true,
validator: (rule, value) => value === 'muji',
},
age: {
type: 'number',
asyncValidator: (rule, value) => {
return new Promise((resolve, reject) => {
if (value < 18) {
reject('too young'); // reject with error message
} else {
resolve();
}
});
},
},
};
const validator = new Schema(descriptor);
validator.validate({ name: 'muji' }, (errors, fields) => {
if (errors) {
// validation failed, errors is an array of all errors
// fields is an object keyed by field name with an array of
// errors per field
return handleErrors(errors, fields);
}
// validation passed
});
// PROMISE USAGE
validator.validate({ name: 'muji', age: 16 }).then(() => {
// validation passed or without error message
}).catch(({ errors, fields }) => {
return handleErrors(errors, fields);
});
上面代码中首先定义了一个 descriptor
常量,通过 descriptor
指向了声明式的校验规则,而数据则在调用 validate
方法时传入。这样的方式天然的在数据和校验规则之间划分出了清晰的边界,而且声明式的描述校验规则,扩展起来更容易。
async-validator 提供了声明式的校验规则描述,在被校验数据和规则之间划分了清晰的边界。async-validator 通过规则(Rules)和校验(Validate)两个元件构成。规则(Rules)用于描述数据应该如何校验,我们可以通过类型(Type)、信息(Message)两个抽象概念来描述规则。校验(Validate)通过输入规则和数据,产生校验结果,比如错误信息等。