logoAnt Design

⌘ K
  • Design
  • Development
  • Components
  • Blog
  • Resources
5.25.0
  • 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
    • Tabs
  • 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
    • 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.
Importimport { Form } from "antd";
Sourcecomponents/form
Docs
Edit this pageChangelog

Resources

Ant Design X
Ant Design Charts
Ant Design Pro
Pro Components
Ant Design Mobile
Ant Design Mini
Ant Design Web3
Ant Design Landing-Landing Templates
Scaffolds-Scaffold Market
Umi-React Application Framework
dumi-Component doc generator
qiankun-Micro-Frontends Framework
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

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 | Options | { focus: boolean }falsefocus: 5.24.0
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 | filled | underlinedoutlined5.13.0 | underlined: 5.24.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:

jsx
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:

jsx
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 text. When there is no need for a label but it needs to be aligned with a colon, it can be set to nullReactNode-null: 5.22.0
labelAlignThe text align of label,left | 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

jsx
<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:

jsx
<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.

jsx
<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:

jsx
{ 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
tsx
<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 })-
jsx
<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 | { focus: boolean }) => voidfocus: 5.24.0
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

tsx
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:

jsx
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:

tsx
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:

tsx
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:

tsx
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:

tsx
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:

tsx
// 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.

tsx
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:

tsx
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 | ReactElement
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

Component TokenHow to use?
Token NameDescriptionTypeDefault Value
inlineItemMarginBottomInline layout form item margin bottomnumber0
itemMarginBottomForm item margin bottomnumber24
labelColonMarginInlineEndLabel colon margin-inline-endnumber8
labelColonMarginInlineStartLabel colon margin-inline-startnumber2
labelColorLabel colorstringrgba(0,0,0,0.88)
labelFontSizeLabel font sizenumber14
labelHeightLabel heightstring | number32
labelRequiredMarkColorRequired mark colorstring#ff4d4f
verticalLabelMarginVertical layout label marginundefined | Margin<string | number>0
verticalLabelPaddingVertical layout label paddingundefined | Padding<string | number>0 0 8px
Global TokenHow to use?

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.

tsx
<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:

jsx
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:

tsx
<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:

jsx
<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:

jsx
const MyInput = (props) => (
<div>
<h3>I am a wrapped Input</h3>
<Input {...props} />
</div>
);
<Form.Item name="input">
<MyInput />
</Form.Item>;

Why does clicking the label in the form change the component state?

Related issue: #47031, #43175, #52152

Form label use HTML label elements to wrap form controls, which focuses the corresponding control when clicked. This is the native behavior of label elements, designed to improve accessibility and user experience. This standard interaction pattern makes it easier for users to interact with form controls. If you need to disable this behavior, you can use htmlFor={null}, though it's generally not recommended.

diff
- <Form.Item name="switch" label="Switch">
+ <Form.Item name="switch" label="Switch" htmlFor={null}>
<Switch />
</Form.Item>
Slide to error field

When validation fails or manually scroll to the error field.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Basic Usage

Basic Form data control. Includes layout, initial values, validation and submit.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Form methods

Call form method with Form.useForm.

Note that useForm is a React Hooks that only works in functional component. You can also use ref to get the form instance in class component: https://codesandbox.io/p/sandbox-ngtjtm

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Form Layout

There are three layout for form: horizontal, vertical, inline.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Form mix layout

Defining a separate layout on Form.Item can achieve multiple layouts for a single form.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Form disabled

Set component to disabled, only works for antd components.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Form variants

Change the variant of all components in the form, options include: outlined filled borderless and underlined.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
5.13.0
Required style

Switch required or optional style with requiredMark.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Form size

Set component size, only works for antd components.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
label can wrap

Turn on labelWrap to wrap label if text is long.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
No block rule

rule with warningOnly will not block form submit.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Watch Hooks

useWatch helps watch the field change and only re-render for the value change. API Ref.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Validate Trigger

For the async validation scenario, high frequency of 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.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Validate Only

Dynamic adjust submit button's disabled status by validateOnly of validateFields.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Path Prefix

In some scenarios, you may want to set a prefix for some fields consistently. You can achieve this effect with HOC.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Dynamic Form Item

Add or remove form items dynamically. add function support config initial value.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Dynamic Form nest Items

Nest dynamic field need extends field. Pass field.name to nest item.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Complex Dynamic Form Item

Multiple Form.List nested usage scenarios.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Nest

name prop support nest data structure. Customize validate message template with validateMessages or message. Ref here about message template.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
complex form control

This demo shows how to use Form.Item with multiple controls. <Form.Item name="field" /> will only bind the control(Input/Select) which is the only children of it. Imagine this case: you added some text description after the Input, then you have to wrap the Input by an extra <Form.Item name="field">. style property of Form.Item could be useful to modify the nested form item layout, or use <Form.Item noStyle /> to turn it into a pure form-binded component(like getFieldDecorator in 3.x).

- <Form.Item label="Field" name="field">
-   <Input />
- </Form.Item>
+ <Form.Item label="Field">
+   <Form.Item name="field" noStyle><Input /></Form.Item> // that will bind input
+   <span>description</span>
+ </Form.Item>

This demo shows three typical usages:

  • Username: extra elements after control, using <Form.Item name="field" noStyle /> inside Form.Item to bind Input.
  • Address: two controls in one line, using two <Form.Item name="field" noStyle /> to bind each control.
  • BirthDate:two controls in one line with independent error message, using two <Form.Item name="field" noStyle /> to bind each control, make layout inline by customizing style property.

Note that, in this case, no more name property should be left in Form.Item with label.

See the Customized Form Controls demo below for more advanced usage.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Customized Form Controls

Customized or third-party form controls can be used in Form, too. Controls must follow these conventions:

  • It has a controlled property value or other name which is equal to the value of valuePropName.
  • It has event onChange or an event which name is equal to the value of trigger.
  • Forward the ref or pass the id property to dom to support the scrollToField method.
CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Store Form Data into Upper Component

We can store form data into upper component or Redux or dva by using onFieldsChange and fields, see more at this rc-field-form demo.

Note: Save Form data globally is not a good practice. You should avoid this if not necessary.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Control between forms

Use Form.Provider to process data between forms. In this case, submit button is in the Modal which is out of Form. You can use form.submit to submit form. Besides, we recommend native <Button htmlType="submit" /> to submit a form.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Inline Login Form

Inline login form is often used in navigation bar.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Login Form

Normal login form which can contain more elements.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Registration

Fill in this form to create a new account for you.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Advanced search

Three columns layout is often used for advanced searching of data table.

Because the width of label is not fixed, you may need to adjust it by customizing its style.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Form in Modal to Create

When user visit a page with a list of items, and want to create a new item. The page can popup a form in Modal, then let user fill in the form to create an item.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Time-related Controls

The value of time-related components is a dayjs object, which we need to pre-process it before we submit to server.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Handle Form Data Manually

Form will collect and validate form data automatically. But if you don't need this feature or the default behavior cannot satisfy your business, you can handle form data manually.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Customized Validation

We provide properties like validateStatus help hasFeedback to customize your own validate status and message, without using Form.

  1. validateStatus: validate status of form components which could be 'success', 'warning', 'error', 'validating'.
  2. hasFeedback: display feed icon of input control
  3. help: display validate message.
CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Dynamic Rules

Perform different check rules according to different situations.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Dependencies

Form.Item can set the associated field through the dependencies property. When the value of the associated field changes, the validation and update will be triggered.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
getValueProps + normalize

By combining getValueProps and normalize, it is possible to convert the format of value, such as converting the timestamp into a dayjs object and then passing it to the DatePicker.

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
Other Form Controls

Demonstration of validation configuration for form controls which are not shown in the demos above.

CodeSandbox Icon
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.