ant design 中的异步表单字段验证
Async form field validation in ant design
如何在ant design中异步验证表单字段?
<FormItem>
{getFieldDecorator('zipcode', {
initialValue: `${customer && customer.zipcode ? customer.zipcode : ''}`,
rules: [
// { required: true, message: 'Please input your Zipcode' },
{ validator: this.handlezipCodeChange },
],
})(
<Input
prefix={
<Icon type="zipcode" style={{ color: 'rgba(0,0,0,.25)', visibility: 'hidden' }} />
}
type="number"
placeholder="Zipcode"
// onChange={this.handlezipCodeChange}
/>
)}
</FormItem>
函数调用
handlezipCodeChange = (rule, value, callback) => {
if (!value) {
callback('Please input your zipcode');
}
if (value.length < 5) {
callback('Please enter minimum length of 5');
}
if (value.length > 5) {
callback('Please enter maximum length of 5');
}
if (value.length === 5) {
const validateZipCode = validateZipcode(value);
if (
validateZipCode &&
validateZipCode.result &&
validateZipCode.result.zipcodeInfo === null
) {
callback('Seems to be Invalid Zipcode');
} else {
callback();
}
}
};
export async function validateZipcode(zipcode) {
return request(`/api/getZipcodeInfo?zipcode=${zipcode}`);
}
如何显示来自 api 响应的错误消息?由于 api 调用需要一些时间才能完成,此时验证函数调用在 api 请求完成之前完全执行。那么我该如何显示错误信息呢?
你是 missing await
之前 validateZipcode
和 async
之前 handlezipCodeChange
:
handlezipCodeChange = async (rule, value, callback) => {
...
if (value.length === 5) {
const validateZipCode = await validateZipcode(value);
...
}
此外,如评论中所述,您需要将 await
添加到 validateZipcode
函数中:
export async function validateZipcode(zipcode) {
return await request(`/api/getZipcodeInfo?zipcode=${zipcode}`);
}
您需要添加它,因为实际上,。
其他解决方案是从 validateZipcode
中取消标记 async
,然后将其用作基于 Promise:
handlezipCodeChange = (...) => {
...
if (value.length === 5) {
const successHandler = ({result = {}}) => result.zipcodeInfo === null ? callback('Seems to be Invalid Zipcode') : callback();
validateZipcode(value)
.then(successHandler)
.catch( error => callback("Can't validate zip code") );
}
}
export function validateZipcode(zipcode) {
return request(`/api/getZipcodeInfo?zipcode=${zipcode}`);
}
关于如何在按钮上应用表单验证的示例,这与提交时的表单无关。
按钮示例:
<Button
id="schematronBtn"
className="m-2 float-left btn-primary"
shape="round"
type="primary"
onClick={() => this.showSchematronModal()}
>
{t('rulesForm.schematronBtn')}
</Button>
字段验证示例:
showSchematronModal() {
this.formRef.current.validateFields().then(() => { // validation succeeded
const { selectStatus } = this.state;
if (selectStatus === 'DRAFT' || selectStatus === 'PILOT') {
this.generatedRuleSchematron(true);
} else {
this.setState({ isSchematronModalVisible: true });
}
}).catch(async e => { // validation failed, call some validation function
if (e.errorFields) { // form has errorFields
await this.onFinishFailed(e);
}
});
}
如何在ant design中异步验证表单字段?
<FormItem>
{getFieldDecorator('zipcode', {
initialValue: `${customer && customer.zipcode ? customer.zipcode : ''}`,
rules: [
// { required: true, message: 'Please input your Zipcode' },
{ validator: this.handlezipCodeChange },
],
})(
<Input
prefix={
<Icon type="zipcode" style={{ color: 'rgba(0,0,0,.25)', visibility: 'hidden' }} />
}
type="number"
placeholder="Zipcode"
// onChange={this.handlezipCodeChange}
/>
)}
</FormItem>
函数调用
handlezipCodeChange = (rule, value, callback) => {
if (!value) {
callback('Please input your zipcode');
}
if (value.length < 5) {
callback('Please enter minimum length of 5');
}
if (value.length > 5) {
callback('Please enter maximum length of 5');
}
if (value.length === 5) {
const validateZipCode = validateZipcode(value);
if (
validateZipCode &&
validateZipCode.result &&
validateZipCode.result.zipcodeInfo === null
) {
callback('Seems to be Invalid Zipcode');
} else {
callback();
}
}
};
export async function validateZipcode(zipcode) {
return request(`/api/getZipcodeInfo?zipcode=${zipcode}`);
}
如何显示来自 api 响应的错误消息?由于 api 调用需要一些时间才能完成,此时验证函数调用在 api 请求完成之前完全执行。那么我该如何显示错误信息呢?
你是 missing await
之前 validateZipcode
和 async
之前 handlezipCodeChange
:
handlezipCodeChange = async (rule, value, callback) => {
...
if (value.length === 5) {
const validateZipCode = await validateZipcode(value);
...
}
此外,如评论中所述,您需要将 await
添加到 validateZipcode
函数中:
export async function validateZipcode(zipcode) {
return await request(`/api/getZipcodeInfo?zipcode=${zipcode}`);
}
您需要添加它,因为实际上,
其他解决方案是从 validateZipcode
中取消标记 async
,然后将其用作基于 Promise:
handlezipCodeChange = (...) => {
...
if (value.length === 5) {
const successHandler = ({result = {}}) => result.zipcodeInfo === null ? callback('Seems to be Invalid Zipcode') : callback();
validateZipcode(value)
.then(successHandler)
.catch( error => callback("Can't validate zip code") );
}
}
export function validateZipcode(zipcode) {
return request(`/api/getZipcodeInfo?zipcode=${zipcode}`);
}
关于如何在按钮上应用表单验证的示例,这与提交时的表单无关。
按钮示例:
<Button
id="schematronBtn"
className="m-2 float-left btn-primary"
shape="round"
type="primary"
onClick={() => this.showSchematronModal()}
>
{t('rulesForm.schematronBtn')}
</Button>
字段验证示例:
showSchematronModal() {
this.formRef.current.validateFields().then(() => { // validation succeeded
const { selectStatus } = this.state;
if (selectStatus === 'DRAFT' || selectStatus === 'PILOT') {
this.generatedRuleSchematron(true);
} else {
this.setState({ isSchematronModalVisible: true });
}
}).catch(async e => { // validation failed, call some validation function
if (e.errorFields) { // form has errorFields
await this.onFinishFailed(e);
}
});
}