Skip to content

Commit

Permalink
feat: Form validation support validateDebounce (ant-design#44633)
Browse files Browse the repository at this point in the history
* chore: bump rc-field-form

* docs: add debounce demo

* docs: update demo

* test: update snapshot

* docs: typo
  • Loading branch information
zombieJ authored Sep 5, 2023
1 parent 69c52b7 commit ee8cf22
Show file tree
Hide file tree
Showing 8 changed files with 375 additions and 1 deletion.
1 change: 1 addition & 0 deletions components/form/FormItem/ItemHolder.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ export default function ItemHolder(props: ItemHolderProps) {
'validateTrigger',
'valuePropName',
'wrapperCol',
'validateDebounce',
])}
>
{/* Label */}
Expand Down
162 changes: 162 additions & 0 deletions components/form/__tests__/__snapshots__/demo-extend.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -27899,6 +27899,168 @@ exports[`renders components/form/demo/validate-static.tsx extend context correct

exports[`renders components/form/demo/validate-static.tsx extend context correctly 2`] = `[]`;

exports[`renders components/form/demo/validate-trigger.tsx extend context correctly 1`] = `
<form
autocomplete="off"
class="ant-form ant-form-vertical"
id="trigger"
style="max-width: 600px;"
>
<div
class="ant-alert ant-alert-info ant-alert-no-icon"
data-show="true"
role="alert"
>
<div
class="ant-alert-content"
>
<div
class="ant-alert-message"
>
Use 'max' rule, continue type chars to see it
</div>
</div>
</div>
<div
class="ant-form-item"
>
<div
class="ant-row ant-form-item-row"
>
<div
class="ant-col ant-form-item-label"
>
<label
class=""
for="trigger_field_a"
title="Field A"
>
Field A
</label>
</div>
<div
class="ant-col ant-form-item-control"
>
<div
class="ant-form-item-control-input"
>
<div
class="ant-form-item-control-input-content"
>
<span
class="ant-input-affix-wrapper ant-input-affix-wrapper-has-feedback"
>
<input
class="ant-input"
id="trigger_field_a"
placeholder="Validate required onBlur"
type="text"
value=""
/>
<span
class="ant-input-suffix"
/>
</span>
</div>
</div>
</div>
</div>
</div>
<div
class="ant-form-item"
>
<div
class="ant-row ant-form-item-row"
>
<div
class="ant-col ant-form-item-label"
>
<label
class=""
for="trigger_field_b"
title="Field B"
>
Field B
</label>
</div>
<div
class="ant-col ant-form-item-control"
>
<div
class="ant-form-item-control-input"
>
<div
class="ant-form-item-control-input-content"
>
<span
class="ant-input-affix-wrapper ant-input-affix-wrapper-has-feedback"
>
<input
class="ant-input"
id="trigger_field_b"
placeholder="Validate required debounce after 1s"
type="text"
value=""
/>
<span
class="ant-input-suffix"
/>
</span>
</div>
</div>
</div>
</div>
</div>
<div
class="ant-form-item"
>
<div
class="ant-row ant-form-item-row"
>
<div
class="ant-col ant-form-item-label"
>
<label
class=""
for="trigger_field_c"
title="Field C"
>
Field C
</label>
</div>
<div
class="ant-col ant-form-item-control"
>
<div
class="ant-form-item-control-input"
>
<div
class="ant-form-item-control-input-content"
>
<span
class="ant-input-affix-wrapper ant-input-affix-wrapper-has-feedback"
>
<input
class="ant-input"
id="trigger_field_c"
placeholder="Validate one by one"
type="text"
value=""
/>
<span
class="ant-input-suffix"
/>
</span>
</div>
</div>
</div>
</div>
</div>
</form>
`;

exports[`renders components/form/demo/validate-trigger.tsx extend context correctly 2`] = `[]`;

exports[`renders components/form/demo/warning-only.tsx extend context correctly 1`] = `
<form
autocomplete="off"
Expand Down
160 changes: 160 additions & 0 deletions components/form/__tests__/__snapshots__/demo.test.tsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -11864,6 +11864,166 @@ exports[`renders components/form/demo/validate-static.tsx correctly 1`] = `
</form>
`;

exports[`renders components/form/demo/validate-trigger.tsx correctly 1`] = `
<form
autocomplete="off"
class="ant-form ant-form-vertical"
id="trigger"
style="max-width:600px"
>
<div
class="ant-alert ant-alert-info ant-alert-no-icon"
data-show="true"
role="alert"
>
<div
class="ant-alert-content"
>
<div
class="ant-alert-message"
>
Use 'max' rule, continue type chars to see it
</div>
</div>
</div>
<div
class="ant-form-item"
>
<div
class="ant-row ant-form-item-row"
>
<div
class="ant-col ant-form-item-label"
>
<label
class=""
for="trigger_field_a"
title="Field A"
>
Field A
</label>
</div>
<div
class="ant-col ant-form-item-control"
>
<div
class="ant-form-item-control-input"
>
<div
class="ant-form-item-control-input-content"
>
<span
class="ant-input-affix-wrapper ant-input-affix-wrapper-has-feedback"
>
<input
class="ant-input"
id="trigger_field_a"
placeholder="Validate required onBlur"
type="text"
value=""
/>
<span
class="ant-input-suffix"
/>
</span>
</div>
</div>
</div>
</div>
</div>
<div
class="ant-form-item"
>
<div
class="ant-row ant-form-item-row"
>
<div
class="ant-col ant-form-item-label"
>
<label
class=""
for="trigger_field_b"
title="Field B"
>
Field B
</label>
</div>
<div
class="ant-col ant-form-item-control"
>
<div
class="ant-form-item-control-input"
>
<div
class="ant-form-item-control-input-content"
>
<span
class="ant-input-affix-wrapper ant-input-affix-wrapper-has-feedback"
>
<input
class="ant-input"
id="trigger_field_b"
placeholder="Validate required debounce after 1s"
type="text"
value=""
/>
<span
class="ant-input-suffix"
/>
</span>
</div>
</div>
</div>
</div>
</div>
<div
class="ant-form-item"
>
<div
class="ant-row ant-form-item-row"
>
<div
class="ant-col ant-form-item-label"
>
<label
class=""
for="trigger_field_c"
title="Field C"
>
Field C
</label>
</div>
<div
class="ant-col ant-form-item-control"
>
<div
class="ant-form-item-control-input"
>
<div
class="ant-form-item-control-input-content"
>
<span
class="ant-input-affix-wrapper ant-input-affix-wrapper-has-feedback"
>
<input
class="ant-input"
id="trigger_field_c"
placeholder="Validate one by one"
type="text"
value=""
/>
<span
class="ant-input-suffix"
/>
</span>
</div>
</div>
</div>
</div>
</div>
</form>
`;

exports[`renders components/form/demo/warning-only.tsx correctly 1`] = `
<form
autocomplete="off"
Expand Down
7 changes: 7 additions & 0 deletions components/form/demo/validate-trigger.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## zh-CN

对于有异步校验的场景,过于频繁的校验会导致后端压力。可以通过 `validateTrigger` 改变校验时机,或者 `validateDebounce` 改变校验频率,或者 `validateFirst` 设置校验短路。

## en-US

For the async validation scenario, too frequent verification will cause backend pressure. You can change the verification timing through `validateTrigger`, or change the verification frequency through `validateDebounce`, or set the verification short circuit through `validateFirst`.
40 changes: 40 additions & 0 deletions components/form/demo/validate-trigger.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import React from 'react';
import { Alert, Form, Input } from 'antd';

const App: React.FC = () => (
<Form name="trigger" style={{ maxWidth: 600 }} layout="vertical" autoComplete="off">
<Alert message="Use 'max' rule, continue type chars to see it" />

<Form.Item
hasFeedback
label="Field A"
name="field_a"
validateTrigger="onBlur"
rules={[{ max: 3 }]}
>
<Input placeholder="Validate required onBlur" />
</Form.Item>

<Form.Item
hasFeedback
label="Field B"
name="field_b"
validateDebounce={1000}
rules={[{ max: 3 }]}
>
<Input placeholder="Validate required debounce after 1s" />
</Form.Item>

<Form.Item
hasFeedback
label="Field C"
name="field_c"
validateFirst
rules={[{ max: 6 }, { max: 3, message: 'Continue input to exceed 6 chars' }]}
>
<Input placeholder="Validate one by one" />
</Form.Item>
</Form>
);

export default App;
Loading

0 comments on commit ee8cf22

Please sign in to comment.