Naming form controls
Form controls must have an accessible name in order to be recognized by assistive technologies.<Field.Label> and <Field.Description> automatically assign the accessible name and description to their associated control:
Labeling select and slider
<Checkbox>, <Radio> and <Switch> components by enclosing them with <Field.Label>:
Implicitly labeling a switch
<Fieldset> when a single label applies to multiple controls, such as a range slider with multiple thumbs or a section that combines several inputs. For checkbox and radio groups, keep the group label in <Fieldset.Legend> and wrap each option with <Field.Item>:
Composing range slider and radio group with fieldset
Building form fields
Pass thename prop to <Field.Root> to include the wrapped control’s value when a parent form is submitted:
Assigning field name to combobox
Submitting data
You can take over form submission using the nativeonSubmit, or custom onFormSubmit props:
Native submission using onSubmit
onFormSubmit, you receive form values as a JavaScript object, with eventDetails provided as a second argument. Additionally, preventDefault() is automatically called on the native submit event:
Submission using onFormSubmit
Constraint validation
Base UI form components support native HTML validation attributes for many validation rules:requiredspecifies a required field.minLengthandmaxLengthspecify a valid length for text fields.patternspecifies a regular expression that the field value must match.stepspecifies an increment that numeric field values must be an integral multiple of.
Defining constraint validation on a text field
name, and wrap controls in a relatively positioned container for best results.
Custom validation
You can add custom validation logic by passing a synchronous or asynchronous validation function to thevalidate prop, which runs after native validations have passed.
Use the validationMode prop to configure when validation is performed:
onSubmit(default) validates all fields when the containing<Form>is submitted, afterwards invalid fields revalidate when their value changes.onBlurvalidates the field when focus moves away.onChangevalidates the field when the value changes, for example, after each keypress in a text field or when a checkbox is checked or unchecked.
validationDebounceTime can be used to debounce the function in use cases such as asynchronous requests or text fields that validate onChange.
Text input using custom asynchronous validation
Server-side validation
You can pass errors returned by (post-submission) server-side validation to theerrors prop, which will be merged into the client-side field state for display.
This should be an object with field names as keys, and an error string or array of strings as the value. Once a field’s value changes, any corresponding error in errors will be cleared from the field state.
Displaying errors returned by server-side validation
Displaying errors
Use<Field.Error> without children to automatically display the field’s native error message when invalid. The match prop can be used to customize the message based on the validity state, and manage internationalization from your application logic:
Customizing error message for a required field
React Hook Form
React Hook Form is a popular library that you can integrate with Base UI to externally manage form and field state for your existing components.Initialize the form
Initialize the form with theuseForm hook, assigning the initial value of each field by their name in the defaultValues parameter:
Initialize a form instance
Integrate components
Use the<Controller> component to integrate with any <Field> component, forwarding the name, field, and fieldState render props to the appropriate part:
Integrating the controller component with Base UI field
Field validation
Specifyrules on the <Controller> in the same format as register options, and use the match prop to delegate control of the error rendering:
Defining validation rules and displaying errors
Submitting data
Wrap your submit handler function withhandleSubmit to receive the form values as a JavaScript object for further handling:
Form submission handler
TanStack Form
TanStack Form is a form library with a function-based API for orchestrating validations that can also be integrated with Base UI.Initialize the form
Create a form instance with theuseForm hook, assigning the initial value of each field by their name in the defaultValues parameter:
Initialize a form instance
Integrate components
Use the<form.Field> component from the form instance to integrate with Base UI components using the children prop, forwarding the various field render props to the appropriate part:
Integrating TanStack Form with Base UI components
Submitting data
To submit the form:- Pass a submit handler function to the
onSubmitparameter ofuseForm. - Call
form.handleSubmit()from an event handler such as formonSubmitoronClickon a button.
Form submission handler