Validar formularios en Vue con Vee Validate

Vee Validate es un plugin de Vue.js que sirve para validar formularios de una manera fácil pero poderosa.

Lo que destaca es:

  • Su simplicidad, pues no se tiene que estudiar demasiado para comenzar a usarlo
  • La flexibilidad que ofrece
  • Soporte para otros idiomas (entre ellos el español)
  • Mensajes de error predefinidos
  • Simple sintaxis y validadores por defecto
  • Reglas personalizadas
  • Manejo del evento que desencadena la validación

En este artículo vamos a dar un repaso y explicación de VeeValidate con algunos ejemplos.

Al final tendremos un ejemplo completo que se puede ver aquí, que es como en la imagen:

Validación de formularios con Vue.js, VeeValidate y Bootstrap

Instalar VeeValidate con webpack

Si lo quieres hacer con Webpack asegúrate de contar con NPM y Node instalado, después de eso ejecuta:

npm install --save vee-validate

En tu archivo donde cargues Vue carga a VeeValidate e indica que Vue lo va a utilizar, de manera que quede como el siguiente código:

VeeValidate sin webpack

Carga el script de VeeValidate después del de Vue en el HTML:

En tu script indica a Vue que lo tome en cuenta:

Vue.use(VeeValidate)

No necesitas importar nada porque al no usar Webpack el objeto de VeeValidate se registra globalmente.

Cargar más idiomas con VeeValidate

VeeValidate viene con muchos idiomas preinstalados. Para cargar un idioma (en este caso lo haré con el idioma español) hay que cargar el script del mismo. Los idiomas están aquí.

Si usas Webpack importa el idioma, así como el validador, e indica al Validador que utilice el idioma, así:

En caso de que no uses WebPack, carga también el script del idioma:

Y luego indica que se usará el idioma español. El trabajo es menos porque el idioma igualmente se registra de manera automática:

VeeValidate.Validator.localize("es");

Nota: recomiendo siempre cargar la misma versión del idioma y de VeeValidate como en el ejemplo, que cargo la versión 2.2.9 de ambas cosas.

Primer validación con VeeValidate

Dentro del componente que vamos a usar, en el input, agregamos un:

v-validate="'un_validador|otro_validador'"

Es importante poner las reglas entre comillas dentro de las comillas, recuerda que estamos pasándole un string, aunque podríamos pasar una string definido desde el código JavaScript.

La lista de validadores está aquí. Un ejemplo para que un dato sea obligatorio es:

<input name="nombre" v-validate="'required'" v-model="usuario.nombre" />

Puedes agregar múltiples reglas, separadas con un pipe |.

Más validaciones

Para hacer que el valor sea un número obligatorio y mayor o igual que 18:

<input name="edad" v-validate="'required|numeric|min_value:18'"/>

Estamos indicando 3 validaciones: que sea obligatorio, que sea numérico y que el valor mínimo que puede tener es 18. En este caso, 18 es el argumento que recibe el validador min_value.

Por cierto, si hay validadores que aceptan más argumentos, los mismos se pasan separados por comas.

Listar errores

VeeValidate va a crear una variable dentro de nuestro componente, llamada errors. Esta variable tendrá toda la información de los errores que tenga nuestro formulario.

En el ejemplo anterior le pusimos un name al input, esto servirá más tarde al mostrar los errores.

Si quieres mostrar el error de ese input, haz esto:

{{errors.first('nombre')}}

En este caso, nombre es el nombre del input.

Para mostrar todos los errores (por ejemplo, en un div al final del formulario) llama a errors.all() e itera sobre ellos.

En el siguiente ejemplo muestro cómo hacerlo en un div con una lista:

El div se muestra si hay errores, si no, se oculta. Dentro del div se muestra una lista de los errores usando un v-for.

Eventos que desencadenan la validación

Se puede controlar el momento en que la validación se hace. Por ejemplo, tal vez quieras hacerla en el evento blur, o tal vez en change.

De hecho se puede validar en muchos eventos. Para ello, al indicarle a Vue el uso de VeeValidate pasa un objeto de opciones:

Yo estoy desencadenando la validación en 3 eventos: change, blur y keyup.

Igualmente se usa el pipe para separarlos, y puede ser un único evento.

Si tú quieres llamar a la validación manualmente, no indiques eventos, es decir, deja la cadena vacía.

Cómo saber si el formulario es válido

Los errores de validación se van a mostrar al usuario, pero eso no le va a impedir hacer la acción, ya que hasta ahora no había una manera de saber, desde el código, si el formulario era válido.

VeeValidete incorpora el método validate dentro de $validator, el cual devuelve una promesa y al resolverse trae un booleano.

El código se explica mejor:

Además de indicar si el formulario es válido, VeeValidate lo validará y mostrará errores al usuario, así que si en la sección anterior desactivaste la validación, al hacer esta acción se desencadena y se muestran los errores.

Validaciones personalizadas

VeeValidate es extensible y permite agregar validaciones propias, definidas por nosotros. Para ello, importamos de nuevo a Validator e invocamos a extend.

La función extend recibe un objeto con dos funciones: getMessage y validate.

La función getMessage debe devolver un mensaje que será mostrado en caso de que validate regrese falso. Recibe dos argumentos: el nombre del campo y los argumentos que pasamos al indicar el validador. Los argumentos son un arreglo, que puede estar vacío si no hay argumentos.

La función validate debe devolver un booleano indicando si la validación es correcta. Recibe el valor que tiene el input y los argumentos que pasamos al validador igualmente como arreglo.

Si no sabes qué son los argumentos del validador, en el ejemplo de min_value, 18 era un argumento.

Veamos el siguiente ejemplo que prohíbe que determinado valor tenga algunas palabras. No te fijes en el algoritmo de la función, ni en la optimización del mismo, fíjate en la forma.

Nota: si usas WebPack tendrías que importar y acceder Validator directamente, no VeeValidate.Validator, en el ejemplo lo hago de esta manera porque no uso WebPack:

Para usarlo en el HTML se indica así:

<textarea v-validate="'required|prohibirPalabras:foo,bar,baz'" name="biografia"></textarea>

Fue en un textarea pero funciona igualmente para un input.

Clases y estilos de validación

En ocasiones hay frameworks CSS (o nuestros estilos lo soportan) para mostrar el input con determinado color para indicar que es válido o inválido.

Por ejemplo, en Bootstrap se usa la clase is-valid para indicar que el input es válido, y la clase is-invalid para lo contrario. Estas clases le dan un color verde y rojo respectivamente.

Podríamos agregar manualmente la clase así:

:class="{'is-valid':!errors.first('nombre'), 'is-invalid': errors.first('nombre')}"

Ya que si errors.first devolviera algo, el valor sería true (bueno, algo que JS considera como true) y de lo contrario, false. Así podríamos intercambiar las clases.

Pero, ¿para qué complicarnos, si VeeValidate puede hacerlo por nosotros? simplemente hay que especificar que use las clases, e indicar cuál usar cuando sea válido o inválido.

Obviamente, si tus clases son distintas a “is-valid” e “is-invalid” simplemente indica su nombre.

Poniendo todo junto

He utilizado la plantilla de Bootstrap que publiqué hace algún tiempo. Gracias a los estilos de Bootstrap podemos hacer la validación más interactiva.

El código HTML queda así:

Y el script así:

Puedes probarlo en vivo aquí.

Como conclusión dejo un enlace a la documentación oficial y uno al repositorio en GitHub en donde encontrarás todavía más cosas muy interesantes sobre VeeValidate.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario