logoAnt Design

⌘ K
  • Design
  • Development
  • Components
  • Blog
  • Resources
5.25.4
  • 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
When to use
Examples
Basic Usage
Form methods
Form Layout
Form mix layout
Form disabled
Form variants
Required style
Form size
label can wrap
No block rule
Watch Hooks
Validate Trigger
Validate Only
Path Prefix
Dynamic Form Item
Dynamic Form nest Items
Complex Dynamic Form Item
Nest
complex form control
Customized Form Controls
Store Form Data into Upper Component
Control between forms
Inline Login Form
Login Form
Registration
Advanced search
Form in Modal to Create
Time-related Controls
Handle Form Data Manually
Customized Validation
Dynamic Rules
Dependencies
getValueProps + normalize
Slide to error field
Other Form Controls
API
Form
validateMessages
Form.Item
dependencies
FeedbackIcons
shouldUpdate
messageVariables
Form.List
operation
Form.ErrorList
Form.Provider
FormInstance
Hooks
Form.useForm
Form.useFormInstance
Form.useWatch
Form.Item.useStatus
Interface
NamePath
GetFieldsValue
FilterFunc
FieldData
Rule
WatchOptions
Design Token
FAQ
Why can't Switch, Checkbox bind data?
How does name fill value when it's an array?
Why is there a form warning when used in Modal?
Why is component defaultValue not working when inside Form.Item?
Why can not call ref of Form at first time?
Why will resetFields re-mount component?
Difference between Form initialValues and Item initialValue?
Why can't getFieldsValue get value at first render?
Why some component not response with setFieldsValue to undefined?
Why does onFieldsChange trigger three times on change when field sets rules?
Why doesn't Form.List support label and need ErrorList to show errors?
Why can't Form.Item dependencies work on Form.List field?
Why doesn't normalize support async?
scrollToFirstError and scrollToField not working?
Continue, why not use ref to bind element?
setFieldsValue do not trigger onFieldsChange or onValuesChange?
Why Form.Item not update value when children is nest?
Why does clicking the label in the form change the component state?

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
contributors
  • DatePickerInput

    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

    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
    codeblock
    codepen icon
    External Link Icon
    expand codeexpand code
    Basic Usage

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

    CodeSandbox Icon
    codeblock
    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
    codeblock
    codepen icon
    External Link Icon
    expand codeexpand code
    Form Layout

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

    CodeSandbox Icon
    codeblock
    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
    codeblock
    codepen icon
    External Link Icon
    expand codeexpand code
    Form disabled

    Set component to disabled, only works for antd components.

    CodeSandbox Icon
    codeblock
    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
    codeblock
    codepen icon
    External Link Icon
    expand codeexpand code
    5.13.0
    Required style

    Switch required or optional style with requiredMark.

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

    Set component size, only works for antd components.

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

    Turn on labelWrap to wrap label if text is long.

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

    rule with warningOnly will not block form submit.

    CodeSandbox Icon
    codeblock
    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
    codeblock
    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
    codeblock
    codepen icon
    External Link Icon
    expand codeexpand code
    Validate Only

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

    CodeSandbox Icon
    codeblock
    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
    codeblock
    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
    codeblock
    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
    codeblock
    codepen icon
    External Link Icon
    expand codeexpand code
    Complex Dynamic Form Item

    Multiple Form.List nested usage scenarios.

    CodeSandbox Icon
    codeblock
    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
    codeblock
    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
    codeblock
    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
    codeblock
    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
    codeblock
    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
    codeblock
    codepen icon
    External Link Icon
    expand codeexpand code
    Inline Login Form

    Inline login form is often used in navigation bar.

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

    Normal login form which can contain more elements.

    CodeSandbox Icon
    codeblock
    codepen icon
    External Link Icon
    expand codeexpand code
    Registration

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

    CodeSandbox Icon
    codeblock
    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
    codeblock
    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
    codeblock
    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
    codeblock
    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
    codeblock
    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
    codeblock
    codepen icon
    External Link Icon
    expand codeexpand code
    Dynamic Rules

    Perform different check rules according to different situations.

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