High performance subscription-based form state management for React

React Final Form

In the interest of making checkered_flag React Final Form the best library it can be, we'd love your thoughts and feedback.

✅ Zero dependencies

✅ Only peer dependencies: React and
? Final Form

✅ Opt-in subscriptions - only update on the state you need!

✅ ? 2.9k gzipped ?

Installation

npm install --save react-final-form final-form

or

yarn add react-final-form final-form

Getting Started

? React Final Form is a thin React wrapper for ? Final Form, which is a
subscriptions-based form state management library that uses the
Observer pattern, so only the
components that need updating are re-rendered as the form's state changes. By
default, ? React Final Form subscribes to all changes, but if you want to
fine tune your form to optimized blazing-fast perfection, you may specify only
the form state that you care about for rendering your gorgeous UI.

You can think of it a little like GraphQL's feature of only fetching the data
your component needs to render, and nothing else.

Here's what it looks like in your code:

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

const MyForm = () => (
  <Form
    onSubmit={onSubmit}
    validate={validate}
    render={({ handleSubmit, pristine, invalid }) => (
      <form onSubmit={handleSubmit}>
        <h2>Simple Default Input</h2>
        <div>
          <label>First Name</label>
          <Field name="firstName" component="input" placeholder="First Name" />
        </div>

        <h2>An Arbitrary Reusable Input Component</h2>
        <div>
          <label>Interests</label>
          <Field name="interests" component={InterestPicker} />
        </div>

        <h2>Render Function</h2>
        <Field
          name="bio"
          render={({ input, meta }) => (
            <div>
              <label>Bio</label>
              <textarea {...input} />
              {meta.touched && meta.error && <span>{meta.error}</span>}
            </div>
          )}
        />

        <h2>Render Function as Children</h2>
        <Field name="phone">
          {({ input, meta }) => (
            <div>
              <label>Phone</label>
              <input type="text" {...input} placeholder="Phone" />
              {meta.touched && meta.error && <span>{meta.error}</span>}
            </div>
          )}
        </Field>

        <button type="submit" disabled={pristine || invalid}>
          Submit
        </button>
      </form>
    )}
  />
)

GitHub