Following are few ways to render form fields
<Formik
initialValues={initialValues}
onSubmit={(values, actions) => {
// ...
}}
>
{(props: FormikProps<FormValues>) => (
<Form>
{/* See options below */}
</Form>
)}
</Formik>
Following are example integrations using Formik
render props.
-
Using
Field as
Wrapper [preferred]Formik will inject
onChange
,onBlur
,name
, andvalue
props.This example does not allow additional
onChange
,onBlur
actions to be specified.<Field as={TextField} name="username" label="Last Name" error={!!props.errors.username} helperText={props.errors.username} />
-
Using
Field component
Wrapper [preferred if custom action handlers required]Formik will inject
field
(containingonChange
,onBlur
,name
, andvalue
) andform
props. Component likely be a wrapper to wrapper to speadfield
.<Field component={MyTextFieldComponent} name="username" label="Last Name" error={!!props.errors.username} helperText={props.errors.username} /> type MyTextFieldComponentProps = Omit<FieldProps<string, FormValues>, 'meta'> & TextFieldProps; const MyTextFieldComponent: React.FC<MyTextFieldComponentProps> = ({ field, form, ...props }) => { const handleChange: ChangeEventHandler<HTMLInputElement> = (e) => { if (onChange) onChange(e); field.onChange(e); } return ( <TextField {...field} // onChange, onBlur, name, and value {...props} onChange={handleChange} /> ); };
-
Custom Component Wrapper
In the example below
MyTextField
is used to wrapTextField
.Use
useField
hook to getfield
andmeta
to handle form actions.This example does not allow additional
onChange
,onBlur
actions to be specified.type MyTextFieldProps = Omit<FieldProps<string, FormValues>, 'meta'> & TextFieldProps; const MyTextField: React.FC<MyTextFieldProps> = (props) => { if (!props.name) throw new Error('name does not exists in props'); const [field, meta, helpers] = useField(props.name); const { touched, error } = meta; return ( <TextField {...props} {...field} // onChange, onBlur, name, and value /> ); };
-
Using
Field
render
propsThis example does not allow additional
onChange
,onBlur
actions to be specified.<Field name="email" > {({ field, form, meta}: FieldProps<string, FormValues>) => ( <TextField {...field} // onChange, onBlur, name, and value error={meta.touched && !!meta.error} helperText={meta.touched && meta.error} /> )} </Field>
See the example here.
Be aware that
<Field>
,<FastField>
,<ErrorMessage>
,connect()
, and<FieldArray>
will NOT work with useFormik()
Use useFormikContext
to get form values and event handlers.