在使用 ant design form 组件自定义校验,进行远程校验数据唯一性的时候,遇到的一些问题以及解决方法。

问题背景

使用 ant design form 设计表单时,某些字段需要进行远程校验,比如:用户名(username),手机号(mobile),就需要自定义校验规则。

错误示例

在需要进行校验的地方,之前错误的写法

/** 验证字段唯一性
* @param key 字段key
* @param value 字段value
*/
const validateUnique = (key: string, value: string): any => {
if (value) {
remoteValidate({ key, value }).then((res: any) => {
if (res.success) {
return res.data.isUnique;
}
}).catch(e => {
message.error(e)
return false
})
}
}

<Form.Item label="用户名" name="username" required rules={[{ required: true, message: '请输入用户名' }, () => ({
validator(_, value) {
if (!value || validateUnique('username', value)) {
return Promise.resolve()
}
return Promise.reject('已存在相同的用户名')
}
})]}>
<Input />
</Form.Item>

以上的写法能够校验字段值为空时的错误,但是在进行远程校验字段唯一性的时候,就无法验证。
validateUnique 返回的值一直为 undefined,使得错误一直是 已存在相同的用户名

解决方法

为了解决校验一直返回 undefined,我们修改写法为

<Form.Item label="用户名" name="username" required rules={[{ required: true, message: '请输入用户名' }, () => ({
validator(_, value) {
return new Promise((resolve, reject) => {
if (value) {
remoteValidate({ key: 'username', value }).then(async (res) => {
if (res.data.isUnique) {
return resolve()
}
return reject('已存在相同的手机号')
})
} else {
return reject()
}
})
}
})]}>
<Input />
</Form.Item>

评论