logoAnt Design

⌘ K
  • 디자인
  • 개발
  • 컴포넌트
  • 블로그
  • 자료
5.21.3
  • Components Overview
  • General
    • Button
    • FloatButton
      5.0.0
    • Icon
    • Typography
  • Layout
    • Divider
    • Flex
      5.10.0
    • Grid
    • Layout
    • Space
    • Splitter
      5.21.0
  • Navigation
    • Anchor
    • Breadcrumb
    • Dropdown
    • Menu
    • Pagination
    • Steps
  • Data Entry
    • AutoComplete
    • Cascader
    • Checkbox
    • ColorPicker
      5.5.0
    • DatePicker
    • Form
    • Input
    • InputNumber
    • Mentions
    • Radio
    • Rate
    • Select
    • Slider
    • Switch
    • TimePicker
    • Transfer
    • TreeSelect
    • Upload
  • Data Display
    • Avatar
    • Badge
    • Calendar
    • Card
    • Carousel
    • Collapse
    • Descriptions
    • Empty
    • Image
    • List
    • Popover
    • QRCode
      5.1.0
    • Segmented
    • Statistic
    • Table
    • Tabs
    • Tag
    • Timeline
    • Tooltip
    • Tour
      5.0.0
    • Tree
  • Feedback
    • Alert
    • Drawer
    • Message
    • Modal
    • Notification
    • Popconfirm
    • Progress
    • Result
    • Skeleton
    • Spin
    • Watermark
      5.1.0
  • Other
    • Affix
    • App
      5.1.0
    • ConfigProvider
    • Util
      5.13.0

Form

High-performance form component with data domain management. Includes data entry, validation, and corresponding styles.
가져오기import{ Form }from"antd";
소스components/form
문서
이 페이지 수정변경 로그

Resources

Ant Design Charts
Ant Design Pro
Ant Design Pro Components
Ant Design Mobile
Ant Design Mini
Ant Design Landing-Landing Templates
Scaffolds-Scaffold Market
Umi-React Application Framework
dumi-Component doc generator
qiankun-Micro-Frontends Framework
ahooks-React Hooks Library
Ant Motion-Motion Solution
China Mirror 🇨🇳

Community

Awesome Ant Design
Medium
Twitter
yuque logoAnt Design in YuQue
Ant Design in Zhihu
Experience Cloud Blog
seeconf logoSEE Conf-Experience Tech Conference
Work with Us

Help

GitHub
Change Log
FAQ
Bug Report
Issues
Discussions
StackOverflow
SegmentFault

Ant XTech logoMore Products

yuque logoYuQue-Document Collaboration Platform
AntV logoAntV-Data Visualization
Egg logoEgg-Enterprise Node.js Framework
Kitchen logoKitchen-Sketch Toolkit
Galacean logoGalacean-Interactive Graphics Solution
xtech logoAnt Financial Experience Tech
Theme Editor
Made with ❤ by
Ant Group and Ant Design Community
loading

When to use

  • When you need to create an instance or collect information.
  • When you need to validate fields in certain rules.

Examples

API

Common props ref:Common props

Form

PropertyDescriptionTypeDefaultVersion
colonConfigure the default value of colon for Form.Item. Indicates whether the colon after the label is displayed (only effective when prop layout is horizontal)booleantrue
disabledSet form component disable, only available for antd componentsbooleanfalse4.21.0
componentSet the Form rendering element. Do not create a DOM node for falseComponentType | falseform
fieldsControl of form fields through state management (such as redux). Not recommended for non-strong demand. View exampleFieldData[]-
formForm control instance created by Form.useForm(). Automatically created when not providedFormInstance-
feedbackIconsCan be passed custom icons while Form.Item element has hasFeedbackFeedbackIcons-5.9.0
initialValuesSet value by Form initialization or resetobject-
labelAlignThe text align of label of all itemsleft | rightright
labelWrapwhether label can be wrapbooleanfalse4.18.0
labelColLabel layout, like <Col> component. Set span offset value like {span: 3, offset: 12} or sm: {span: 3, offset: 12}object-
layoutForm layouthorizontal | vertical | inlinehorizontal
nameForm name. Will be the prefix of Field idstring-
preserveKeep field value even when field removed. You can get the preserve field value by getFieldsValue(true)booleantrue4.4.0
requiredMarkRequired mark style. Can use required mark or optional mark. You can not config to single Form.Item since this is a Form level configboolean | optional | ((label: ReactNode, info: { required: boolean }) => ReactNode)truerenderProps: 5.9.0
scrollToFirstErrorAuto scroll to first failed field when submitboolean | Optionsfalse
sizeSet field component size (antd components only)small | middle | large-
validateMessagesValidation prompt template, description see belowValidateMessages-
validateTriggerConfig field validate triggerstring | string[]onChange4.3.0
variantVariant of components inside formoutlined | borderless | filledoutlined5.13.0
wrapperColThe layout for input controls, same as labelColobject-
onFieldsChangeTrigger when field updatedfunction(changedFields, allFields)-
onFinishTrigger after submitting the form and verifying data successfullyfunction(values)-
onFinishFailedTrigger after submitting the form and verifying data failedfunction({ values, errorFields, outOfDate })-
onValuesChangeTrigger when value updatedfunction(changedValues, allValues)-
clearOnDestroyClear form values when the form is uninstalledbooleanfalse5.18.0

It accepts all props which native forms support but onSubmit.

validateMessages

Form provides default verification error messages. You can modify the template by configuring validateMessages property. A common usage is to configure localization:

const validateMessages = {
required: "'${name}' is required!",
// ...
};
<Form validateMessages={validateMessages} />;

Besides, ConfigProvider also provides a global configuration scheme that allows for uniform configuration error notification templates:

const validateMessages = {
required: "'${name}' is Required!",
// ...
};
<ConfigProvider form={{ validateMessages }}>
<Form />
</ConfigProvider>;

Form.Item

Form field component for data bidirectional binding, validation, layout, and so on.

PropertyDescriptionTypeDefaultVersion
colonUsed with label, whether to display : after label text.booleantrue
dependenciesSet the dependency field. See belowNamePath[]-
extraThe extra prompt message. It is similar to help. Usage example: to display error message and prompt message at the same timeReactNode-
getValueFromEventSpecify how to get value from event or other onChange arguments(..args: any[]) => any-
getValuePropsAdditional props with sub component (It's not recommended to generate dynamic function prop by getValueProps. Please pass it to child component directly)(value: any) => Record<string, any>-4.2.0
hasFeedbackUsed with validateStatus, this option specifies the validation status icon. Recommended to be used only with Input. Also, It can get feedback icons via icons prop.boolean | { icons: FeedbackIcons }falseicons: 5.9.0
helpThe prompt message. If not provided, the prompt message will be generated by the validation rule.ReactNode-
hiddenWhether to hide Form.Item (still collect and validate value)booleanfalse4.4.0
htmlForSet sub label htmlForstring-
initialValueConfig sub default value. Form initialValues get higher priority when conflictstring-4.2.0
labelLabel textReactNode-
labelAlignThe text align of labelleft | rightright
labelColThe layout of label. You can set span offset to something like {span: 3, offset: 12} or sm: {span: 3, offset: 12} same as with <Col>. You can set labelCol on Form which will not affect nest Item. If both exists, use Item firstobject-
messageVariablesThe default validate field info, description see belowRecord<string, string>-4.7.0
nameField name, support arrayNamePath-
normalizeNormalize value from component value before passing to Form instance. Do not support async(value, prevValue, prevValues) => any-
noStyleNo style for true, used as a pure field control. Will inherit parent Form.Item validateStatus if self validateStatus not configuredbooleanfalse
preserveKeep field value even when field removedbooleantrue4.4.0
requiredDisplay required style. It will be generated by the validation rulebooleanfalse
rulesRules for field validation. Click here to see an exampleRule[]-
shouldUpdateCustom field update logic. See belowboolean | (prevValue, curValue) => booleanfalse
tooltipConfig tooltip infoReactNode | TooltipProps & { icon: ReactNode }-4.7.0
triggerWhen to collect the value of children node. Click here to see an examplestringonChange
validateDebounceDelay milliseconds to start validationnumber-5.9.0
validateFirstWhether stop validate on first rule of error for this field. Will parallel validate when parallel configuredboolean | parallelfalseparallel: 4.5.0
validateStatusThe validation status. If not provided, it will be generated by validation rule. options: success warning error validatingstring-
validateTriggerWhen to validate the value of children nodestring | string[]onChange
valuePropNameProps of children node, for example, the prop of Switch or Checkbox is checked. This prop is an encapsulation of getValueProps, which will be invalid after customizing getValuePropsstringvalue
wrapperColThe layout for input controls, same as labelCol. You can set wrapperCol on Form which will not affect nest Item. If both exists, use Item firstobject-
layoutForm item layouthorizontal | vertical-5.18.0

After wrapped by Form.Item with name property, value(or other property defined by valuePropName) onChange(or other property defined by trigger) props will be added to form controls, the flow of form data will be handled by Form which will cause:

  1. You shouldn't use onChange on each form control to collect data(use onValuesChange of Form), but you can still listen to onChange.
  2. You cannot set value for each form control via value or defaultValue prop, you should set default value with initialValues of Form. Note that initialValues cannot be updated by setState dynamically, you should use setFieldsValue in that situation.
  3. You shouldn't call setState manually, please use form.setFieldsValue to change value programmatically.

dependencies

Used when there are dependencies between fields. If a field has the dependencies prop, this field will automatically trigger updates and validations when upstream is updated. A common scenario is a user registration form with "password" and "confirm password" fields. The "Confirm Password" validation depends on the "Password" field. After setting dependencies, the "Password" field update will re-trigger the validation of "Check Password". You can refer examples.

dependencies shouldn't be used together with shouldUpdate, since it may result in conflicting update logic.

FeedbackIcons

({ status: ValidateStatus, errors: ReactNode, warnings: ReactNode }) => Record<ValidateStatus, ReactNode>

shouldUpdate

Form updates only the modified field-related components for performance optimization purposes by incremental update. In most cases, you only need to write code or do validation with the dependencies property. In some specific cases, such as when a new field option appears with a field value changed, or you just want to keep some area updating by form update, you can modify the update logic of Form.Item via the shouldUpdate.

When shouldUpdate is true, any Form update will cause the Form.Item to be re-rendered. This is very helpful for custom rendering some areas. It should be noted that the child component should be returned in a function, otherwise shouldUpdate won't behave correctly:

related issue: #34500

<Form.Item shouldUpdate>
{() => {
return <pre>{JSON.stringify(form.getFieldsValue(), null, 2)}</pre>;
}}
</Form.Item>

You can ref example to see detail.

When shouldUpdate is a function, it will be called by form values update. Providing original values and current value to compare. This is very helpful for rendering additional fields based on values:

<Form.Item shouldUpdate={(prevValues, curValues) => prevValues.additional !== curValues.additional}>
{() => {
return (
<Form.Item name="other">
<Input />
</Form.Item>
);
}}
</Form.Item>

You can ref example to see detail.

messageVariables

You can modify the default verification information of Form.Item through messageVariables.

<Form>
<Form.Item
messageVariables={{ another: 'good' }}
label="user"
rules={[{ required: true, message: '${another} is required' }]}
>
<Input />
</Form.Item>
<Form.Item
messageVariables={{ label: 'good' }}
label={<span>user</span>}
rules={[{ required: true, message: '${label} is required' }]}
>
<Input />
</Form.Item>
</Form>

Since 5.20.2, when you don't want to convert ${}, you can use \\${} to skip:

{ required: true, message: '${label} is convert, \\${label} is not convert' }
// good is convert, ${label} is not convert

Form.List

Provides array management for fields.

PropertyDescriptionTypeDefaultVersion
childrenRender function(fields: Field[], operation: { add, remove, move }, meta: { errors }) => React.ReactNode-
initialValueConfig sub default value. Form initialValues get higher priority when conflictany[]-4.9.0
nameField name, support array. List is also a field, so it will return all the values by getFieldsValue. You can change this logic by configNamePath-
rulesValidate rules, only support customize validator. Should work with ErrorList{ validator, message }[]-4.7.0
<Form.List>
{(fields) => (
<div>
{fields.map((field) => (
<Form.Item {...field}>
<Input />
</Form.Item>
))}
</div>
)}
</Form.List>

Note: You should not configure Form.Item initialValue under Form.List. It always should be configured by Form.List initialValue or Form initialValues.

operation

Some operator functions in render form of Form.List.

PropertyDescriptionTypeDefaultVersion
addadd form item(defaultValue?: any, insertIndex?: number) => voidinsertIndex4.6.0
movemove form item(from: number, to: number) => void-
removeremove form item(index: number | number[]) => voidnumber[]4.5.0

Form.ErrorList

New in 4.7.0. Show error messages, should only work with rules of Form.List. See example.

PropertyDescriptionTypeDefault
errorsError listReactNode[]-

Form.Provider

Provide linkage between forms. If a sub form with name prop update, it will auto trigger Provider related events. See example.

PropertyDescriptionTypeDefault
onFormChangeTriggered when a sub form field updatesfunction(formName: string, info: { changedFields, forms })-
onFormFinishTriggered when a sub form submitsfunction(formName: string, info: { values, forms })-
<Form.Provider
onFormFinish={(name) => {
if (name === 'form1') {
// Do something...
}
}}
>
<Form name="form1">...</Form>
<Form name="form2">...</Form>
</Form.Provider>

FormInstance

NameDescriptionTypeVersion
getFieldErrorGet the error messages by the field name(name: NamePath) => string[]
getFieldInstanceGet field instance(name: NamePath) => any4.4.0
getFieldsErrorGet the error messages by the fields name. Return as an array(nameList?: NamePath[]) => FieldError[]
getFieldsValueGet values by a set of field names. Return according to the corresponding structure. Default return mounted field value, but you can use getFieldsValue(true) to get all valuesGetFieldsValue
getFieldValueGet the value by the field name(name: NamePath) => any
isFieldsTouchedCheck if fields have been operated. Check if all fields is touched when allTouched is true(nameList?: NamePath[], allTouched?: boolean) => boolean
isFieldTouchedCheck if a field has been operated(name: NamePath) => boolean
isFieldValidatingCheck field if is in validating(name: NamePath) => boolean
resetFieldsReset fields to initialValues(fields?: NamePath[]) => void
scrollToFieldScroll to field position(name: NamePath, options: [ScrollOptions]) => void
setFieldsSet fields status(fields: FieldData[]) => void
setFieldValueSet fields value(Will directly pass to form store and reset validation message. If you do not want to modify passed object, please clone first)(name: NamePath, value: any) => void4.22.0
setFieldsValueSet fields value(Will directly pass to form store and reset validation message. If you do not want to modify passed object, please clone first). Use setFieldValue instead if you want to only config single value in Form.List(values) => void
submitSubmit the form. It's same as click submit button() => void
validateFieldsValidate fields. Use recursive to validate all the field in the path(nameList?: NamePath[], config?: ValidateConfig) => Promise

validateFields

export interface ValidateConfig {
// New in 5.5.0. Only validate content and not show error message on UI.
validateOnly?: boolean;
// New in 5.9.0. Recursively validate the provided `nameList` and its sub-paths.
recursive?: boolean;
// New in 5.11.0. Validate dirty fields (touched + validated).
// It's useful to validate fields only when they are touched or validated.
dirty?: boolean;
}

return sample:

validateFields()
.then((values) => {
/*
values:
{
username: 'username',
password: 'password',
}
*/
})
.catch((errorInfo) => {
/*
errorInfo:
{
values: {
username: 'username',
password: 'password',
},
errorFields: [
{ name: ['password'], errors: ['Please input your Password!'] },
],
outOfDate: false,
}
*/
});

Hooks

Form.useForm

type Form.useForm = (): [FormInstance]

Create Form instance to maintain data store.

Form.useFormInstance

type Form.useFormInstance = (): FormInstance

Added in 4.20.0. Get current context form instance to avoid pass as props between components:

const Sub = () => {
const form = Form.useFormInstance();
return <Button onClick={() => form.setFieldsValue({})} />;
};
export default () => {
const [form] = Form.useForm();
return (
<Form form={form}>
<Sub />
</Form>
);
};

Form.useWatch

type Form.useWatch = (namePath: NamePath | (selector: (values: Store) => any), formInstance?: FormInstance | WatchOptions): Value

5.12.0 add selector

Watch the value of a field. You can use this to interact with other hooks like useSWR to reduce development costs:

const Demo = () => {
const [form] = Form.useForm();
const userName = Form.useWatch('username', form);
const { data: options } = useSWR(`/api/user/${userName}`, fetcher);
return (
<Form form={form}>
<Form.Item name="username">
<AutoComplete options={options} />
</Form.Item>
</Form>
);
};

If your component is wrapped by Form.Item, you can omit the second argument, Form.useWatch will find the nearest FormInstance automatically.

By default useWatch only watches the registered field. If you want to watch the unregistered field, please use preserve:

const Demo = () => {
const [form] = Form.useForm();
const age = Form.useWatch('age', { form, preserve: true });
console.log(age);
return (
<div>
<Button onClick={() => form.setFieldValue('age', 2)}>Update</Button>
<Form form={form}>
<Form.Item name="name">
<Input />
</Form.Item>
</Form>
</div>
);
};

Form.Item.useStatus

type Form.Item.useStatus = (): { status: ValidateStatus | undefined, errors: ReactNode[], warnings: ReactNode[] }

Added in 4.22.0. Could be used to get validate status of Form.Item. If this hook is not used under Form.Item, status would be undefined. Added error and warnings in 5.4.0, Could be used to get error messages and warning messages of Form.Item:

const CustomInput = ({ value, onChange }) => {
const { status, errors } = Form.Item.useStatus();
return (
<input
value={value}
onChange={onChange}
className={`custom-input-${status}`}
placeholder={(errors.length && errors[0]) || ''}
/>
);
};
export default () => (
<Form>
<Form.Item name="username">
<CustomInput />
</Form.Item>
</Form>
);

Difference between other data fetching method

Form only update the Field which changed to avoid full refresh perf issue. Thus you can not get real time value with getFieldsValue in render. And useWatch will rerender current component to sync with latest value. You can also use Field renderProps to get better performance if only want to do conditional render. If component no need care field value change, you can use onValuesChange to give to parent component to avoid current one rerender.

Interface

NamePath

string | number | (string | number)[]

GetFieldsValue

getFieldsValue provides overloaded methods:

getFieldsValue(nameList?: true | NamePath[], filterFunc?: FilterFunc)

When nameList is empty, return all registered fields, including values of List (even if List has no Item children).

When nameList is true, return all values in store, including unregistered fields. For example, if you set the value of an unregistered Item through setFieldsValue, you can also get all values through true.

When nameList is an array, return the value of the specified path. Note that nameList is a nested array. For example, you need the value of a certain path as follows:

// Single path
form.getFieldsValue([['user', 'age']]);
// multiple path
form.getFieldsValue([
['user', 'age'],
['preset', 'account'],
]);

getFieldsValue({ strict?: boolean, filter?: FilterFunc })

New in 5.8.0. Accept configuration parameters. When strict is true, only the value of Item will be matched. For example, in { list: [{ bamboo: 1, little: 2 }] }, if List is only bound to the bamboo field, then getFieldsValue({ strict: true }) will only get { list: [{ bamboo: 1 }] }.

FilterFunc

To filter certain field values, meta will provide information related to the fields. For example, it can be used to retrieve values that have only been modified by the user, and so on.

type FilterFunc = (meta: { touched: boolean; validating: boolean }) => boolean;

FieldData

NameDescriptionType
errorsError messagesstring[]
warningsWarning messagesstring[]
nameField name pathNamePath[]
touchedWhether is operatedboolean
validatingWhether is in validatingboolean
valueField valueany

Rule

Rule supports a config object, or a function returning config object:

type Rule = RuleConfig | ((form: FormInstance) => RuleConfig);
NameDescriptionTypeVersion
defaultFieldValidate rule for all array elements, valid when type is arrayrule
enumMatch enum value. You need to set type to enum to enable thisany[]
fieldsValidate rule for child elements, valid when type is array or objectRecord<string, rule>
lenLength of string, number, arraynumber
maxtype required: max length of string, number, arraynumber
messageError message. Will auto generate by template if not providedstring
mintype required: min length of string, number, arraynumber
patternRegex patternRegExp
requiredRequired fieldboolean
transformTransform value to the rule before validation(value) => any
typeNormally string |number |boolean |url | email. More type to ref herestring
validateTriggerSet validate trigger event. Must be the sub set of validateTrigger in Form.Itemstring | string[]
validatorCustomize validation rule. Accept Promise as return. See example(rule, value) => Promise
warningOnlyWarning only. Not block form submitboolean4.17.0
whitespaceFailed if only has whitespace, only work with type: 'string' ruleboolean

WatchOptions

NameDescriptionTypeDefaultVersion
formForm instanceFormInstanceCurrent form in context5.4.0
preserveWhether to watch the field which has no matched Form.Itembooleanfalse5.4.0

Design Token

컴포넌트 토큰어떻게 사용하나요?

토큰 이름설명타입기본값
inlineItemMarginBottom行内布局表单项间距number0
itemMarginBottom表单项间距number24
labelColonMarginInlineEnd标签冒号后间距number8
labelColonMarginInlineStart标签冒号前间距number2
labelColor标签颜色stringrgba(0, 0, 0, 0.88)
labelFontSize标签字体大小number14
labelHeight标签高度string | number32
labelRequiredMarkColor必填项标记颜色string#ff4d4f
verticalLabelMargin垂直布局标签外边距undefined | Margin<string | number>0
verticalLabelPadding垂直布局标签内边距undefined | Padding<string | number>0 0 8px

글로벌 토큰어떻게 사용하나요?

FAQ

Why can't Switch、Checkbox bind data?

Form.Item default bind value to value prop, but Switch or Checkbox value prop is checked. You can use valuePropName to change bind value prop.

<Form.Item name="fieldA" valuePropName="checked">
<Switch />
</Form.Item>

How does name fill value when it's an array?

name will fill value by array order. When there exists number in it and no related field in form store, it will auto convert field to array. If you want to keep it as object, use string like: ['1', 'name'].

Why is there a form warning when used in Modal?

Warning: Instance created by useForm is not connect to any Form element. Forget to pass form prop?

Before Modal opens, children elements do not exist in the view. You can set forceRender on Modal to pre-render its children. Click here to view an example.

Why is component defaultValue not working when inside Form.Item?

Components inside Form.Item with name property will turn into controlled mode, which makes defaultValue not work anymore. Please try initialValues of Form to set default value.

Why can not call ref of Form at first time?

ref only receives the mounted instance. please ref React official doc: https://reactjs.org/docs/refs-and-the-dom.html#accessing-refs

Why will resetFields re-mount component?

resetFields will re-mount component under Field to clean up customize component side effects (like async data, cached state, etc.). It's by design.

Difference between Form initialValues and Item initialValue?

In most case, we always recommend to use Form initialValues. Use Item initialValue only with dynamic field usage. Priority follows the rules:

  1. Form initialValues is the first priority
  2. Field initialValue is secondary *. Does not work when multiple Item with same name setting the initialValue

Why can't getFieldsValue get value at first render?

getFieldsValue returns collected field data by default, but the Form.Item node is not ready at the first render. You can get all field data by getFieldsValue(true).

Why some component not response with setFieldsValue to undefined?

value change from certain one to undefined in React means from controlled mode to uncontrolled mode. Thus it will not change display value but modified FormStore in fact. You can HOC to handle this:

const MyInput = ({
// Force use controlled mode
value = '',
...rest
}) => <input value={value} {...rest} />;
<Form.Item name="my">
<MyInput />
</Form.Item>;

Why does onFieldsChange trigger three times on change when field sets rules?

Validating is also part of the value updating. It pass follow steps:

  1. Trigger value change
  2. Rule validating
  3. Rule validated

In each onFieldsChange, you will get false > true > false with isFieldValidating.

Why doesn't Form.List support label and need ErrorList to show errors?

Form.List use renderProps which mean internal structure is flexible. Thus label and error can not have best place. If you want to use antd label, you can wrap with Form.Item instead.

Why can't Form.Item dependencies work on Form.List field?

Your name path should also contain Form.List name:

<Form.List name="users">
{(fields) =>
fields.map((field) => (
<React.Fragment key={field.key}>
<Form.Item name={[field.name, 'name']} {...someRest1} />
<Form.Item name={[field.name, 'age']} {...someRest1} />
</React.Fragment>
))
}
</Form.List>

dependencies should be ['users', 0, 'name']

Why doesn't normalize support async?

React can not get correct interaction of controlled component with async value update. When user trigger onChange, component will do no response since value update is async. If you want to trigger value update async, you should use customize component to handle value state internal and pass sync value control to Form instead.

scrollToFirstError and scrollToField not working?

  1. use custom form control

See similar issues: #28370 #27994

Starting from version 5.17.0, the sliding operation will prioritize using the ref element forwarded by the form control elements. Therefore, when considering custom components to support verification scrolling, please consider forwarding it to the form control elements first.

scrollToFirstError and scrollToField deps on id attribute passed to form control, please make sure that it hasn't been ignored in your custom form control. Check codesandbox for solution.

  1. multiple forms on same page

If there are multiple forms on the page, and there are duplicate same name form item, the form scroll probably may find the form item with the same name in another form. You need to set a different name for the Form component to distinguish it.

Continue, why not use ref to bind element?

Form can not get real DOM node when customize component not support ref. It will get warning in React Strict Mode if wrap with Class Component and call findDOMNode. So we use id to locate element.

setFieldsValue do not trigger onFieldsChange or onValuesChange?

It's by design. Only user interactive can trigger the change event. This design is aim to avoid call setFieldsValue in change event which may makes loop calling.

Why Form.Item not update value when children is nest?

Form.Item will inject value and onChange to children when render. Once your field component is wrapped, props will not pass to the correct node. Follow code will not work as expect:

<Form.Item name="input">
<div>
<h3>I am a wrapped Input</h3>
<Input />
</div>
</Form.Item>

You can use HOC to solve this problem, don't forget passing props to form control component:

const MyInput = (props) => (
<div>
<h3>I am a wrapped Input</h3>
<Input {...props} />
</div>
);
<Form.Item name="input">
<MyInput />
</Form.Item>;
Slide to error field
codepen icon
External Link Icon
expand codeexpand code
Basic Usage
codepen icon
External Link Icon
expand codeexpand code
Form methods
codepen icon
External Link Icon
expand codeexpand code
Form Layout
codepen icon
External Link Icon
expand codeexpand code
Form mix layout
codepen icon
External Link Icon
expand codeexpand code
Form disabled
codepen icon
External Link Icon
expand codeexpand code
Form variants
codepen icon
External Link Icon
expand codeexpand code
5.13.0
Required style
codepen icon
External Link Icon
expand codeexpand code
Form size
codepen icon
External Link Icon
expand codeexpand code
label can wrap
codepen icon
External Link Icon
expand codeexpand code
No block rule
codepen icon
External Link Icon
expand codeexpand code
Watch Hooks
codepen icon
External Link Icon
expand codeexpand code
Validate Trigger
codepen icon
External Link Icon
expand codeexpand code
Validate Only
codepen icon
External Link Icon
expand codeexpand code
Path Prefix
codepen icon
External Link Icon
expand codeexpand code
Dynamic Form Item
codepen icon
External Link Icon
expand codeexpand code
Dynamic Form nest Items
codepen icon
External Link Icon
expand codeexpand code
Dynamic Form nest pure Items
codepen icon
External Link Icon
expand codeexpand code
Complex Dynamic Form Item
codepen icon
External Link Icon
expand codeexpand code
Nest
codepen icon
External Link Icon
expand codeexpand code
complex form control
codepen icon
External Link Icon
expand codeexpand code
Customized Form Controls
codepen icon
External Link Icon
expand codeexpand code
Store Form Data into Upper Component
codepen icon
External Link Icon
expand codeexpand code
Control between forms
codepen icon
External Link Icon
expand codeexpand code
Inline Login Form
codepen icon
External Link Icon
expand codeexpand code
Login Form
codepen icon
External Link Icon
expand codeexpand code
Registration
codepen icon
External Link Icon
expand codeexpand code
Advanced search
codepen icon
External Link Icon
expand codeexpand code
Form in Modal to Create
codepen icon
External Link Icon
expand codeexpand code
Time-related Controls
codepen icon
External Link Icon
expand codeexpand code
Handle Form Data Manually
codepen icon
External Link Icon
expand codeexpand code
Customized Validation
codepen icon
External Link Icon
expand codeexpand code
Dynamic Rules
codepen icon
External Link Icon
expand codeexpand code
Dependencies
codepen icon
External Link Icon
expand codeexpand code
getValueProps + normalize
codepen icon
External Link Icon
expand codeexpand code
Other Form Controls
codepen icon
External Link Icon
expand codeexpand code
Disabled Input Debug
codepen icon
External Link Icon
expand codeexpand code
label ellipsis
codepen icon
External Link Icon
expand codeexpand code
Test col 24 usage
codepen icon
External Link Icon
expand codeexpand code
Ref item
codepen icon
External Link Icon
expand codeexpand code
Custom feedback icons
codepen icon
External Link Icon
expand codeexpand code
Component Token
codepen icon
External Link Icon
expand codeexpand code
Select a option and change input text above

Name Value: 
Custom Value: 
Use 'max' rule, continue type chars to see it
Item 1
{}
Need Help?
Select province
RMB
[
  {
    "name": [
      "username"
    ],
    "value": "Ant Design"
  }
]
( No user yet. )
Forgot password
or Register now!
Zhejiang / Hangzhou / West Lake
+86
website
0 / 100
select your gender
We must make sure that your are a human.
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
Collapse
Search Result List
I'm Select
I'm Cascader
I'm TreeSelect
-
0
Try modify `Password2` and then modify `Password`

Only Update when password2 updated:

{}
China
Please select a country
 
Please select favourite colors
machines
ABCDEF
longgggggggggggggggggggggggggggggggggg

Click or drag file to this area to upload

Support for a single or bulk upload.

Buggy!
Buggy!
Buggy!
人民币
人民币
人民币
Bamboo
 
Bamboo