--- description: Collect and validate form data. links: - label: GitHub icon: i-simple-icons-github to: https://github.com/nuxtlabs/ui/blob/dev/src/runtime/components/forms/Form.ts navigation: badge: New --- ## Usage Use the Form component to validate form data using schema libraries such as [Yup](https://github.com/jquense/yup), [Zod](https://github.com/colinhacks/zod), [Joi](https://github.com/hapijs/joi) or your own validation logic. It works seamlessly with the FormGroup component to automatically display error messages around form elements. The Form component requires the `validate` and `state` props for form validation. - `state` - a reactive object that holds the current state of the form. - `validate` - a function that takes the form's state as input and returns an array of `FormError` objects with the following fields: - `message` - the error message to display. - `path` - the path to the form element matching the `name`. ::component-example #default :form-example-basic{class="space-y-4 w-60"} #code ```vue ``` :: ## Schema You can provide a schema from [Yup](#yup), [Zod](#zod) or [Joi](#joi) through the `schema` prop to validate the state. It's important to note that **none of these libraries are included** by default, so make sure to **install the one you need**. ### Yup ::component-example #default :form-example-yup{class="space-y-4 w-60"} #code ```vue ``` :: ### Zod ::component-example #default :form-example-zod{class="space-y-4 w-60"} #code ```vue ``` :: ### Joi ::component-example #default :form-example-joi{class="space-y-4 w-60"} #code ```vue ``` :: ## Type Inference You can utilize Zod and Yup's type inference feature to automatically infer the types of your schema and form data. This allows for strong type checking and better code validation, reducing the likelihood of errors. ```vue // [...] ``` ## Other libraries For other validation libraries, you can define your own component with custom validation logic. Here is an example with [Vuelidate](https://github.com/vuelidate/vuelidate): ```vue ``` ## Input events The Form component automatically triggers validation upon input `blur` or `change` events. This ensures that any errors are displayed as soon as the user interacts with the form elements. ::component-example #default :form-example-elements{class="space-y-4 w-60"} :: ## Props :component-props