看到输出的结果有点疑问,想向老师请教一二

来源:9-8 实现自定义校验的功能

嘻茶

2020-12-09

我表达能力不是很好,上图片加以说明吧。
图片描述
为了测试自定义校验的功能,用的例子也是老师在这一小节中相似的示例。看这个gif图的表现,其实可以说咱们这一小节想要实现的功能已经实现了,但是呢当我看到控制台的输出以后,我就有点犯迷糊了,截图如下。

图片描述
如上图所示,我们控制台显示errorSchema里其实是有内容的,但是valid为true,也就是说我们通过校验了,这显然不是我们所期望的,对吧?老师。
您课程中演示的时候errors中之所以有内容是因为您还给数据加了一个minLength的校验,咱们输入的长度不够10,所以errors中有内容,valid也为false,我把minLength的校验去掉了,valid为true,但是明显两次密码根本不相同呀。
所以老师,能指点一二吗?

写回答

2回答

chenweiyan

2020-12-24

https://github.com/pure-vue/vue3-jsonschema-from/blob/8b7b06d94331df56f0eee22d49c689626164055b/packages/core/src/validator/index.ts#L262

// 课程源码修改,需要的同学可以做个参考
// 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)
}


0
0

Jokcy

2020-12-09

是的,因为我们这里取的valid是判断errors数组是否为空,但是我们自定义校验的结果并没有放到errors里面,所以导致了这个问题,理论上我们缺少了一步把新的errorSchema反馈到errors上面的过程,这个在真实的开源项目里面实现了,同学可以在群里看到项目地址

0
0

Vue3.0+TS打造企业级组件库 前端中高级开发者必修课

深度匹配高级前端工程师用人需求 打造属于你自己的开源项目

1310 学习 · 251 问题

查看课程