Migration to v2
Version 2.0.0 focuses on adding robust hooks support as well as streamlining the public API towards simplicity and consistency. It also adds first class TypeScript support!
Key Features
- New hooks for custom fields and common use-cases makes accessing Form data significantly easier
useFormValueuseFielduseFieldArrayuseFormSubmituseErrorsuseTouched
- Out-of-the-box support for
<select multiple>as well as checkbox groups - Better
FieldArrayvalidation behavior; arrayHelpers only trigger validation on the list itself, not nested fields - Library is now written in TypeScript.
Breaking Changes
There is lot of rewritten code, so there may be subtle changes that I've missed. Please test in your apps thoroughly.
Package exports have been rearranged
Previously, most library components and utils were exported as static properties
of the <Form> component as well as being named exports from the package. For
ESM consumers the default export is the <Form> component and
the <Field>, <FieldArray>, <Message>, <Submit>, and <Summary> components
are still static properties of Form:
import Form from 'react-formal';<Form> <Form.Field /></Form>;Every thing else is exported as a named export including an object called formStatics
which is all the static properties on Form.
import { useField, setter, toFormErrors } from 'react-formal';For CommonJS consumers the import is the Form component with all other exports as static properties.
Field render prop arguments
Instead of passing a single props argument and the resolved Input, Field and FieldArrays
now pass props and meta as seperate arguments. The resolved input has been removed
entirely as it was unnecessary for custom components. For details about how fields
resolve to native elements field meta now contains nativeTagName and nativeType
<Form.Field name="birthDate"> {(props, meta) => <DatePicker {...props} />}</Form.Field>For very custom Field components consider useField and friends.
Change: events -> validateOn
The validation events prop has been changed to validateOn and limited to only change and blur.
Arbitrary events cannot be configured any longer. To support other sorts of event
handlers use the Field render prop.
<Field> {({ onBlur, ...pros }) => <MyInput onValidate={onBlur} {...props} />}</Field>Field's always inject onChange
Previously Fields would only inject handlers for their configured events. This
meant that when set to null a Field could not trigger updates. This has been fixed, so
events (now validateOn) now refer exclusively to handlers that trigger validation and onChange is always
injected, even when events is null.
Note that onChange can still trigger validation, e.g.
validateOn="change" will inject an onChange handler that triggers an update as well as validation,
validateOn={null} will still inject onChange but it will only trigger an update
to the field value, not validation.
FieldArray render prop arguments
<FieldArray> have switched to be entirely non-presentational components. Meaning,
they no longer accept an as prop or element children. It's generally recommended
that FieldArray be used to compose other Fields via the render prop (but not required).
For uses existing renderProp usage the arguments are now:
<Form.FieldArray> {(values, arrayHelpers, meta) => ... }</Form.FieldArray>useFieldArray is also now available as an alternative to render props.
Migrating FieldArray Components
This is likely an uncommon pattern, but Field Arrays like the following:
<Form.FieldArray as={MyListComponent} />Will no longer work, instead switch to the render prop and pass the helpers and values
in as props to your component, or take ad avantage of useFieldArray in MyListComponent.
<Form.FieldArray> {(values, arrayHelpers, meta) => ( <MyListComponent values={values} helpers={arrayHelpers} meta={meta} /> )}</Form.FieldArray>FieldArray validation
Previously, <FieldArray>s would trigger validation the same as <Field>s, validating
the entire branch below their name. Now validation is only triggered for the list itself.
Practically this means that it's no longer required to set events={null} on FieldArrays as a well
of disabling top level validation.