看到输出的结果有点疑问,想向老师请教一二
来源:9-8 实现自定义校验的功能

嘻茶
2020-12-09
我表达能力不是很好,上图片加以说明吧。
为了测试自定义校验的功能,用的例子也是老师在这一小节中相似的示例。看这个gif图的表现,其实可以说咱们这一小节想要实现的功能已经实现了,但是呢当我看到控制台的输出以后,我就有点犯迷糊了,截图如下。
如上图所示,我们控制台显示errorSchema里其实是有内容的,但是valid为true,也就是说我们通过校验了,这显然不是我们所期望的,对吧?老师。
您课程中演示的时候errors中之所以有内容是因为您还给数据加了一个minLength的校验,咱们输入的长度不够10,所以errors中有内容,valid也为false,我把minLength的校验去掉了,valid为true,但是明显两次密码根本不相同呀。
所以老师,能指点一二吗?
写回答
2回答
-
chenweiyan
2020-12-24
// 课程源码修改,需要的同学可以做个参考 // lib/validator.ts export function validateFormData( validator: Ajv, formData: any, schema: Schema, locale = 'zh', customValidate?: (data: any, errors: any) => void, ) { let validationError = null ... const proxy = createErrorProxy() customValidate(formData, proxy) const newErrorSchema = mergetObjects(errorSchema, proxy, true) const newErrors = toErrorList(newErrorSchema) return { errors: newErrors, errorSchema: newErrorSchema, valid: newErrors.length === 0, } } export function toErrorList(errorSchema: ErrorSchema, fieldName = 'root') { // XXX: We should transform fieldName as a full field path string. let errorList: TransformedErrorObject[] = [] if ('__errors' in errorSchema) { errorList = errorList.concat( (errorSchema.__errors || []).map((stack) => { return { message: `${fieldName}: ${stack}`, } as TransformedErrorObject }), ) } return Object.keys(errorSchema).reduce((acc, key) => { if (key !== '__errors') { acc = acc.concat(toErrorList(errorSchema[key], key)) } return acc }, errorList) }
00 -
Jokcy
2020-12-09
是的,因为我们这里取的valid是判断errors数组是否为空,但是我们自定义校验的结果并没有放到errors里面,所以导致了这个问题,理论上我们缺少了一步把新的errorSchema反馈到errors上面的过程,这个在真实的开源项目里面实现了,同学可以在群里看到项目地址
00
相似问题