Form
A Form component with React Hook Form and Zod.
Docs
Forms are tricky. They are one of the most common things you'll build in a mobile or web application, but also one of the most complex.
Well-designed mobile forms are:
- Well-structured and semantically correct.
- Well-styled and consistent with the rest of the application.
- Accessible with ARIA attributes and proper labels.
- Easy to use and understand.
- Easy to maintain and test.
- Easy to style and theme.
In this guide, we will take a look at building forms with react-hook-form
and zod
. We're going to use a <FormField>
component to compose accessible forms for your mobile application.
Features
The <Form />
component is a wrapper around the react-hook-form
library. It provides a few things:
- Composable components for building forms.
- A
<FormField />
component for building controlled form fields. - Form validation using
zod
. - Handles accessibility and error messages.
- Uses
React.useId()
for generating unique IDs. - Applies the correct
aria
attributes to form fields based on states. - Bring your own schema library. We use
zod
but you can use anything you want. - You have full control over the markup and styling.
Anatomy
Example
Installation
Usage
Create a form schema
Define the shape of your form using a Zod schema. You can read more about using Zod in the Zod documentation.
Define a form
Use the useForM
hook from react-hook-for
m to create a form.
Since FormField
is using a controlled component, you need to provide a default value for the field. See the React Hook Form docs to learn more about controlled components.
Build your form
Use the FormField
component to create a form field.
Done
That's it. You now have a fully accessible form that is type-safe with client-side validation.
Examples
See the following links for more examples on how to use the <Form />
component with other components:
API
Form
The main wrapper component that provides form context.
FormField
A controlled form field component.
FormItem
Container for form field components.
FormLabel
Label component for form fields.
FormControl
Wrapper for the form input component.
FormDescription
Optional description text below the form field.
FormMessage
Component to display validation error messages.