Vue 3 + VeeValidate - Required Checkbox Example

Example built with Vue 3.0.0 and VeeValidate 4.0.0-beta.6

Other versions available:

This is a quick example of how to implement a required checkbox field in Vue 3 with VeeValidate. For a more detailed registration form example that includes a bunch of other fields see Vue 3 + VeeValidate - Form Validation Example.

Here it is in action: (See on StackBlitz at

Vue 3 + VeeValidate Required Checkbox App Component

The app component template contains a form with a single required checkbox fields and a validation message. The form and checkbox field are built with the VeeValidate <Form /> and <Field /> components which automatically hook into the validation rules (schema) based on the name of the field.

The form calls the onSubmit() method when the form is submitted and valid. Validation rules are bound to the form with the validation-schema prop, and validation errors are provided to the form template via the scoped slot v-slot="{ errors }".

The app component code defines the required checkbox validation rule with the Yup schema validation library which VeeValidate supports out of the box, the checkbox is set to required with the rule Yup.bool().required() and setting the value of the checkbox input to true (:value="true"), for more info on Yup see

The onSubmit() method is called when the form is valid and submitted, and simply displays the contents of the form in a javascript alert.

    <div class="card m-3">
        <h5 class="card-header">Vue 3 + VeeValidate - Required Checkbox</h5>
        <div class="card-body">
            <Form @submit="onSubmit" :validation-schema="schema" v-slot="{ errors }">
                <div class="form-group form-check">
                    <Field name="acceptTerms" type="checkbox" id="acceptTerms" :value="true" class="form-check-input" :class="{ 'is-invalid': errors.acceptTerms }" />
                    <label for="acceptTerms" class="form-check-label">Accept Terms & Conditions</label>
                    <div class="invalid-feedback">{{errors.acceptTerms}}</div>
                <div class="form-group">
                    <button type="submit" class="btn btn-primary mr-1">Register</button>

import { Form, Field } from 'vee-validate';
import * as Yup from 'yup';

export default {
    components: {
    setup() {
        const schema = Yup.object().shape({
            acceptTerms: Yup.bool()
                .required('Accept Ts & Cs is required')

        const onSubmit = values => {
            // display form values on success
            alert('SUCCESS!! :-)\n\n' + JSON.stringify(values, null, 4));

        return {


Subscribe or Follow Me For Updates

Subscribe to my YouTube channel or follow me on Twitter, Facebook or GitHub to be notified when I post new content.

Other than coding...

I'm currently attempting to travel around Australia by motorcycle with my wife Tina on a pair of Royal Enfield Himalayans. You can follow our adventures on YouTube, Instagram and Facebook.

Need Some Vue 3 Help?

Search fiverr to find help quickly from experienced Vue 3 developers.

Supported by