--- category: Components type: Data Entry cols: 1 title: Form cover: https://gw.alipayobjects.com/zos/alicdn/ORmcdeaoO/Form.svg --- High performance Form component with data scope management. Including data collection, verification, and styles. ## When to use - When you need to create an instance or collect information. - When you need to validate fields in certain rules. ## API ### Form | Property | Description | Type | Default | Version | | --- | --- | --- | --- | --- | | colon | Configure the default value of `colon` for Form.Item. Indicates whether the colon after the label is displayed (only effective when prop layout is horizontal) | boolean | true | | | component | Set the Form rendering element. Do not create a DOM node for `false` | ComponentType \| false | form | | | fields | Control of form fields through state management (such as redux). Not recommended for non-strong demand. View [example](#components-form-demo-global-state) | [FieldData](#FieldData)\[] | - | | | form | Form control instance created by `Form.useForm()`. Automatically created when not provided | [FormInstance](#FormInstance) | - | | | initialValues | Set value by Form initialization or reset | object | - | | | labelAlign | The text align of label of all items | `left` \| `right` | `right` | | | labelWrap | whether label can be wrap | boolean | false | 4.18.0 | | labelCol | Label layout, like `` component. Set `span` `offset` value like `{span: 3, offset: 12}` or `sm: {span: 3, offset: 12}` | [object](/components/grid/#Col) | - | | | layout | Form layout | `horizontal` \| `vertical` \| `inline` | `horizontal` | | | name | Form name. Will be the prefix of Field `id` | string | - | | | preserve | Keep field value even when field removed | boolean | true | 4.4.0 | | requiredMark | Required mark style. Can use required mark or optional mark. You can not config to single Form.Item since this is a Form level config | boolean \| `optional` | true | 4.6.0 | | scrollToFirstError | Auto scroll to first failed field when submit | boolean \| [Options](https://github.com/stipsan/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options) | false | | | size | Set field component size (antd components only) | `small` \| `middle` \| `large` | - | | | validateMessages | Validation prompt template, description [see below](#validateMessages) | [ValidateMessages](https://github.com/react-component/field-form/blob/master/src/utils/messages.ts) | - | | | validateTrigger | Config field validate trigger | string \| string\[] | `onChange` | 4.3.0 | | wrapperCol | The layout for input controls, same as `labelCol` | [object](/components/grid/#Col) | - | | | onFieldsChange | Trigger when field updated | function(changedFields, allFields) | - | | | onFinish | Trigger after submitting the form and verifying data successfully | function(values) | - | | | onFinishFailed | Trigger after submitting the form and verifying data failed | function({ values, errorFields, outOfDate }) | - | | | onValuesChange | Trigger when value updated | function(changedValues, allValues) | - | | ### validateMessages Form provides [default verification error messages](https://github.com/react-component/field-form/blob/master/src/utils/messages.ts). You can modify the template by configuring `validateMessages` property. A common usage is to configure localization: ```jsx const validateMessages = { required: "'${name}' is required!", // ... };
; ``` Besides, [ConfigProvider](/components/config-provider/) also provides a global configuration scheme that allows for uniform configuration error notification templates: ```jsx const validateMessages = { required: "'${name}' is Required!", // ... }; ; ``` ## Form.Item Form field component for data bidirectional binding, validation, layout, and so on. | Property | Description | Type | Default | Version | | --- | --- | --- | --- | --- | | colon | Used with `label`, whether to display `:` after label text. | boolean | true | | | dependencies | Set the dependency field. See [below](#dependencies) | [NamePath](#NamePath)\[] | - | | | extra | The extra prompt message. It is similar to help. Usage example: to display error message and prompt message at the same time | ReactNode | - | | | getValueFromEvent | Specify how to get value from event or other onChange arguments | (..args: any\[]) => any | - | | | getValueProps | Additional props with sub component | (value: any) => any | - | 4.2.0 | | hasFeedback | Used with `validateStatus`, this option specifies the validation status icon. Recommended to be used only with `Input` | boolean | false | | | help | The prompt message. If not provided, the prompt message will be generated by the validation rule. | ReactNode | - | | | hidden | Whether to hide Form.Item (still collect and validate value) | boolean | false | 4.4.0 | | htmlFor | Set sub label `htmlFor` | string | - | | | initialValue | Config sub default value. Form `initialValues` get higher priority when conflict | string | - | 4.2.0 | | label | Label text | ReactNode | - | | | labelAlign | The text align of label | `left` \| `right` | `right` | | | labelCol | The layout of label. You can set `span` `offset` to something like `{span: 3, offset: 12}` or `sm: {span: 3, offset: 12}` same as with ``. You can set `labelCol` on Form which will not affect nest Item. If both exists, use Item first | [object](/components/grid/#Col) | - | | | messageVariables | The default validate field info | Record<string, string> | - | 4.7.0 | | name | Field name, support array | [NamePath](#NamePath) | - | | | normalize | Normalize value from component value before passing to Form instance. Do not support async | (value, prevValue, prevValues) => any | - | | | noStyle | No style for `true`, used as a pure field control | boolean | false | | | preserve | Keep field value even when field removed | boolean | true | 4.4.0 | | required | Display required style. It will be generated by the validation rule | boolean | false | | | rules | Rules for field validation. Click [here](#components-form-demo-basic) to see an example | [Rule](#Rule)\[] | - | | | shouldUpdate | Custom field update logic. See [below](#shouldUpdate) | boolean \| (prevValue, curValue) => boolean | false | | | tooltip | Config tooltip info | ReactNode \| [TooltipProps & { icon: ReactNode }](/components/tooltip#API) | - | 4.7.0 | | trigger | When to collect the value of children node. Click [here](#components-form-demo-customized-form-controls) to see an example | string | `onChange` | | | validateFirst | Whether stop validate on first rule of error for this field. Will parallel validate when `parallel` cofigured | boolean \| `parallel` | false | `parallel`: 4.5.0 | | validateStatus | The validation status. If not provided, it will be generated by validation rule. options: `success` `warning` `error` `validating` | string | - | | | validateTrigger | When to validate the value of children node | string \| string\[] | `onChange` | | | valuePropName | Props of children node, for example, the prop of Switch is 'checked'. This prop is an encapsulation of `getValueProps`, which will be invalid after customizing `getValueProps` | string | `value` | | | wrapperCol | The layout for input controls, same as `labelCol`. You can set `wrapperCol` on Form which will not affect nest Item. If both exists, use Item first | [object](/components/grid/#Col) | - | | 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](#components-form-demo-register). `dependencies` shouldn't be used together with `shouldUpdate`, since it may result in conflicting update logic. `dependencies` supports `Form.Item` with render props children since `4.5.0`. ### 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`](#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: ```jsx {() => { return
{JSON.stringify(form.getFieldsValue(), null, 2)}
; }}
``` You can ref [example](#components-form-demo-horizontal-login) 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 prevValues.additional !== curValues.additional}> {() => { return ( ); }} ``` You can ref [example](#components-form-demo-control-hooks) to see detail. ### messageVariables You can modify the default verification information of Form.Item through `messageVariables`. ```jsx user}>
``` ## Form.List Provides array management for fields. | Property | Description | Type | Default | Version | | --- | --- | --- | --- | --- | | children | Render function | (fields: Field\[], operation: { add, remove, move }, meta: { errors }) => React.ReactNode | - | | | initialValue | Config sub default value. Form `initialValues` get higher priority when conflict | any\[] | - | 4.9.0 | | name | Field name, support array | [NamePath](#NamePath) | - | | | rules | Validate rules, only support customize validator. Should work with [ErrorList](#Form.ErrorList) | { validator, message }\[] | - | 4.7.0 | ```tsx {fields => (
{fields.map(field => ( ))}
)}
``` 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. | Property | Description | Type | Default | Version | | --- | --- | --- | --- | --- | | add | add form item | (defaultValue?: any, insertIndex?: number) => void | insertIndex | 4.6.0 | | move | move form item | (from: number, to: number) => void | - | | | remove | remove form item | (index: number \| number\[]) => void | number\[] | 4.5.0 | ## Form.ErrorList New in 4.7.0. Show error messages, should only work with `rules` of Form.List. See [example](#components-form-demo-dynamic-form-item). | Property | Description | Type | Default | | -------- | ----------- | ------------ | ------- | | errors | Error list | ReactNode\[] | - | ## Form.Provider Provide linkage between forms. If a sub form with `name` prop update, it will auto trigger Provider related events. See [example](#components-form-demo-form-context). | Property | Description | Type | Default | | --- | --- | --- | --- | | onFormChange | Triggered when a sub form field updates | function(formName: string, info: { changedFields, forms }) | - | | onFormFinish | Triggered when a sub form submits | function(formName: string, info: { values, forms }) | - | ```jsx { if (name === 'form1') { // Do something... } }} >
...
...
``` ### FormInstance | Name | Description | Type | Version | | --- | --- | --- | --- | | getFieldError | Get the error messages by the field name | (name: [NamePath](#NamePath)) => string\[] | | | getFieldInstance | Get field instance | (name: [NamePath](#NamePath)) => any | 4.4.0 | | getFieldsError | Get the error messages by the fields name. Return as an array | (nameList?: [NamePath](#NamePath)\[]) => FieldError\[] | | | getFieldsValue | Get 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 values | (nameList?: [NamePath](#NamePath)\[], filterFunc?: (meta: { touched: boolean, validating: boolean }) => boolean) => any | | | getFieldValue | Get the value by the field name | (name: [NamePath](#NamePath)) => any | | | isFieldsTouched | Check if fields have been operated. Check if all fields is touched when `allTouched` is `true` | (nameList?: [NamePath](#NamePath)\[], allTouched?: boolean) => boolean | | | isFieldTouched | Check if a field has been operated | (name: [NamePath](#NamePath)) => boolean | | | isFieldValidating | Check field if is in validating | (name: [NamePath](#NamePath)) => boolean | | | resetFields | Reset fields to `initialValues` | (fields?: [NamePath](#NamePath)\[]) => void | | | scrollToField | Scroll to field position | (name: [NamePath](#NamePath), options: \[[ScrollOptions](https://github.com/stipsan/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options)]) => void | | | setFields | Set fields status | (fields: [FieldData](#FieldData)\[]) => void | | | setFieldsValue | Set fields value(Will directly pass to form store. If you do not want to modify passed object, please clone first) | (values) => void | | | submit | Submit the form. It's same as click `submit` button | () => void | | | validateFields | Validate fields | (nameList?: [NamePath](#NamePath)\[]) => Promise | | #### validateFields 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