--- title: VeeValidate description: Building forms with VeeValidate and Zod. primitive: https://vee-validate.logaretm.com/v4/guide/overview/ --- Forms are tricky. They are one of the most common things you'll build in a web application, but also one of the most complex. Well-designed HTML forms are: - Well-structured and semantically correct. - Easy to use and navigate (keyboard). - Accessible with ARIA attributes and proper labels. - Has support for client and server side validation. - Well-styled and consistent with the rest of the application. In this guide, we will take a look at building forms with [`vee-validate`](https://vee-validate.logaretm.com/v4/) and [`zod`](https://zod.dev). We're going to use a `` component to compose accessible forms using Radix Vue components. ## Features The `
` component is a wrapper around the `vee-validate` library. It provides a few things: - Composable components for building forms. - A `` component for building controlled form fields. - Form validation using `zod`. - Applies the correct `aria` attributes to form fields based on states, handle unique IDs - Built to work with all Radix Vue components. - Bring your own schema library. We use `zod` but you can use any other supported schema validation you want, like [`yup`](https://github.com/jquense/yup) or [`valibot`](https://valibot.dev/). - **You have full control over the markup and styling.** [`vee-validate`](https://vee-validate.logaretm.com/v4/) makes use of two flavors to add validation to your forms. - Composition API - Higher-order components (HOC) ## Anatomy ```vue ``` ## 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](https://zod.dev). Use `@vee-validate/zod` to integrate Zod schema validation with `vee-validate` `toTypedSchema` also makes the form values and submitted values typed automatically and caters for both input and output types of that schema. ```vue:line-numbers {2-3,5-7} ``` ### Define a form Use the `useForm` composable from `vee-validate` or use `
` component to create a form. ### Build your form Based on last step we can either use `` component or `useForm` composable `useForm` is recommended because values are typed automatically ```vue:line-numbers {2} ``` ### 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 `vee-validate` features with other components: - [Checkbox](/docs/components/checkbox#form) - [Date Picker](/docs/components/date-picker#form) - [Input](/docs/components/input#form) - [Radio Group](/docs/components/radio-group#form) - [Select](/docs/components/select#form) - [Slider](/docs/components/slider#form) - [Switch](/docs/components/switch#form) - [Textarea](/docs/components/textarea#form) - [Combobox](/docs/components/combobox#form) ## Extras This example shows how to add motion to your forms with [Formkit AutoAnimate](https://auto-animate.formkit.com/)