DEV Community

Carsten Behrens
Carsten Behrens

Posted on • Originally published at carstenbehrens.com

Vue Form Validation using Yup

This blog post will show you how to validate forms in Vue 3 using Yup.

Setup

In this blog post, I will use the following setup:

  • Vue 3 with TypeScript, Prettier, and ESLint.
  • Yup, for form validation.

If you don't use TypeScript, you can skip the parts specific to TypeScript.

Before we can start, we will have to add Yup as a dependency in our project.

npm install yup
Enter fullscreen mode Exit fullscreen mode

Simple Form Validation

Creating a form

First, we will create a simple form with a single input field.

<template>
  <form @submit.prevent="validateForm">
    <label for="name">Name</label>
    <input type="text" id="name" v-model="formInput.name" />
    <button type="submit">Submit</button>
  </form>
</template>

<script setup lang="ts">
import { reactive } from "vue";

const formInput = reactive({
  name: "",
});
</script>
Enter fullscreen mode Exit fullscreen mode

Adding a validation schema

Now that we have a form, we can add a validation schema. To do this, we will use Yup.

Yup allows us to create a schema containing each field's rules. In our case, we only have one field, name.

import { object, string } from 'yup';

const schema = object({
  name: string().required('Name is required'),
});
Enter fullscreen mode Exit fullscreen mode

The field name should be a string and is required.
Please note that when using Yup, if a string is required, then an empty string is not allowed.

Validating the form input

We can validate the form input now that we have our form and schema.

const validateForm = () => {
  try {
    schema.validateSync(formInput);
  } catch (error) {
    console.log(error);
  }
};
Enter fullscreen mode Exit fullscreen mode

We'll show an error message in the console if the validation fails.

Our complete component looks like this:

<template>
  <form @submit.prevent="validateForm">
    <label for="name">Name</label>
    <input type="text" id="name" v-model="formInput.name" />
    <button type="submit">Submit</button>
  </form>
</template>

<script setup lang="ts">
import { object, string } from "yup";
import { reactive } from "vue";

const formInput = reactive({
  name: "",
});

const schema = object({
  name: string().required(),
});

const validateForm = () => {
  try {
    schema.validateSync(formInput);
  } catch (error) {
    console.log(error);
  }
};
</script>
Enter fullscreen mode Exit fullscreen mode

Now that we have a simple form validation, we can address some missing features.

  • Our form only has one field
  • We don't show any error messages to the user; without this the user will not know what went wrong.
  • We only validate the form when the user submits the form, the user experience would be improved if we validated the form as the user types.

I'll address these issues in another blog post if there is enough interest.

Top comments (1)

Collapse
 
alicenjoroge profile image
Alice

interested in second post, thank you so much!