import { Field } from 'react-final-form'

A component that registers a field with the containing form, subscribes to field state, and injects both field state and callback functions, onBlur, onChange, and onFocus via a render prop.

The <Field/> will rerender any time the field state it is subscribed to changes. By default it subscribes to all field state. You can control which field state it subscribes to with the subscription prop.


<Field/> accepts FieldProps and will call the render function with FieldRenderProps.

The only two required props are name and one of component, render, or children.

Basic Usage

You need to do three things when using <Field/>:

1. Provide a name prop

The name of the field can be a reference to a "deep" value via dot-and-bracket syntax, e.g. 'clients[0].address.street'.

2. Provide a way to render the field

There are four ways to render a <Field/> component:

<Field component/>'input' or 'select' or 'textarea'
<Field component/>React.ComponentType
<Field render/>Function
<Field children/>Function

The only important distinction is that if you pass a component to the component prop, it will be rendered with React.createElement(), resulting in your component actually being in the React node tree, i.e. inspectable in DevTools.

3. Connect the callbacks to your input

If you are using component="input" (or select or textarea), <Field/> will do this step for you.

<Field name="myField" component="input" />

But if you are using a custom component or a render prop, you will need to do this yourself.

<Field/> makes this as easy as possible by bundling all of the props that your input component needs into one object prop, called input, which contains name, onBlur, onChange, onFocus, and value.

HTML Inputs

If you're going to be using one of the standard HTML inputs, <input>, <select>, or <textarea>, it's just a matter of using the spread operator to populate the props of the input.

<Field name="myField">
  {props => (
      <input {...props.input} />

Custom Inputs

The only thing a custom input needs to do to be compatible with React Final Form is to accept a value prop and somehow call the onChange callback to change the value.

import TextField from '@material-ui/core/TextField'


<Field name="myField">
  {props => (

Note: To use an array for the values (with another field type, like a tags-input component), you can do value={[...props.input.value]} to avoid "Invalid prop type of 'string' warning"

Now, let's look at some examples!