Required Fields

You might've noticed that the previous examples avoided implementing the most common validation rule, the required rule. This topic requires its own guide as it involves intent more than actual logic.

What makes a field required

A field is required when your form absolutely needs that field's value to be present, which brings you to another question, what does it mean for a value to be present?

From vee-validate's perspective, there are a set of empty values which are not the same as falsy values. These values are:

  • undefined.
  • null.
  • Empty Strings.
  • Empty Arrays.

Notice that empty arrays [] are considered an empty value, this is an assumption made by vee-validate based on common use-cases. Meanwhile 0 is a valid present value, and false is also a present value.

For the number 0, while it is a falsy value, it is still a perfectly valid value to be provided by the user.

For the boolean false, this is tricky because you could argue that false is the unchecked value of a checkbox. A counter argument is you could have a radio button with Yes/No options and false would be a valid checked value. As you could tell this subject is based on assumptions and intent, this is just a design decision for vee-validate.

Optional Fields

Assume you apply a min:3 rule to an optional field, wouldn't that invalidate the field as it is empty?

As you noticed from the examples presented earlier, vee-validate doesn't validate optional fields when they are empty. Which makes sense, if the user didn't input any value in an optional field, it is valid. Until they've entered a non-empty value, rules won't be run.

Creating a required rule

Now that you learned the design decisions for this topic, you know that required is a special rule, as it needs to report more than the validity of the value, it needs to also report the required state of that value as well.

To create a required rule, you need to add a computesRequired key to the extend function rule options:


extend('required', {
  validate() {
    // ...
  // This rule reports the `required` state of the field.
  computesRequired: true

Then you need to actually report said state, this is done inside the validate function:


extend('required', {
  validate(value) {
    return {
      required: true,
      valid: ['', null, undefined].indexOf(value) === -1
  computesRequired: true

Note that the return type of the validate function is now an object containing:

  • A valid key which reports the validity of the field.
  • A required key which reports if the field is required or not.

For the classic required rule, the required key will always be true. However, having the power to dynamically set the required state for the field allows you to create really powerful and interesting rules. For an example of such a rule, see required_if implementation.