Para hacer la validación de formularios en Vue, hay algunos aspectos que debemos tener en cuenta, y disponemos del paquete Vuelidate con algunas funcionalidades que nos sirven para ello. Veamos cómo lo haríamos.
Cuando en un formulario hacemos submit, el comportamiento por defecto es que se haga una redirección mandando los datos del formulario, pero nosotros podemos mandar o no (podemos guardar datos en vuex como paso intermedio, por ejemplo) los datos a nuestro backend, al servicio REST, y navegar utilizando Vue Router. Para evitar que se haga esa acción cuando hacemos submit, podemos capturar el evento @submit.prevent, añadiendo la funcionalidad que queramos: comprobación de los campos, envío de datos, navegación...
<form @submit.prevent="checkSubmit"> ... </form> |
methods: {
checkSubmit() {
console.log('submit!')
...
} |
La forma de hacer las comprobaciones será a través del método que definamos en submit.prevent, utilizando variables y estilos y renderizaciones condicionales para mostrar los errores. En el apartado de Vuelidate veremos que nos facilita esta tarea.
Algunos componentes Primevue permiten utilizar required e implementan un mensaje de error en caso de que se intente hacer submit y no se haya rellenado el campo, pero no lo utilizaremos, pues, aparte de que no está incluido en todos los componentes, nos ofrece menos flexibilidad.
Podemos consultar la documentación oficial de Vuelidate para ver todos los detalles, en este apartado indicaremos el uso básico y más común que haremos de este paquete.
Vuelidate nos añade la posibilidad de definir un bloque validations dentro del export default de nuestros componentes Vue, en el que indicar las variables que se quieren comprobar y las comprobaciones que hacer sobre ellas. Además, también nos proporciona una serie de propiedades calculadas para comprobar los errores que hay y formar nuestra interfaz en consecuencia.
Para instalar Vuelidate, primero tendremos que añadirlo a las dependencias de nuestro proyecto ejecutando:
npm i vuelidate |
Después tendremos que añadir lo siguiente a nuestro main.js:
import Vuelidate from 'vuelidate' Vue.use(Vuelidate) |
Con esto ya podremos usar el bloque validations en nuestros componentes. En ellos solo tendremos que importar los validadores que que vayamos a utilizar.
Los validadores son las comprobaciones que se harán sobre las variables que especifiquemos, y por defecto Vuelidate proporciona los siguientes:
| Nombre | Parámetros | Descripción |
|---|---|---|
required | - | Comprueba que el campo no está vacío, comprobando también arrays vacíos y cadenas de texto que contengan sólo espacios en blanco. |
requiredIf | locator* | como la anterior, pero si se cumple la condición que pasemos como parámetro. |
requiredUnless | locator* | en este caso, es requerido si la condición que le proporcionamos es falsa. |
minLength | longitud mínima | comprueba que el valor tenga la longitud mínima que indiquemos. También funciona con arrays. |
maxLength | longitud máxima | comprueba que el valor tenga una longitud máxima que indiquemos. También funciona con arrays. |
minValue | mínimo | para valores numéricos y fechas, comprueba que el valor es mayor o igual que el que indiquemos. |
maxValue | máximo | para valores numéricos y fechas, comprueba que el valor es menor o igual que el que indiquemos. |
between | mínimo, máximo | comprueba que el valor está entre un mínimo y un máximo que le pasemos. |
alpha | - | acepta sólo letras. |
alphaNum | - | cepta sólo caracteres alfanuméricos. |
numeric | - | acepta sólo números. |
integer | - | acepta enteros positivos y negativos. |
decimal | - | acepta números decimales, tanto positivos como negativos. |
email | - | acepta solo cadenas con el formato de direcciones email. |
ipAddress | - | acepta sólo direcciones IPv4, notación tipo 127.0.0.1. |
macAddress | separator=':' | Acepta direcciones MAC. |
sameAs | locator* | comprueba que es igual que lo que le pasemos. |
url | - | acepta sólo URLs. |
or | validators... | funciona cuando se cumple al menos alguno de los validadores que se le pasan. |
and | validators... | funciona cuando se cumplen todos los validadores que se le pasan. |
not | validator | Pasa cuando se le da un validador que no pasa. Se puede encadenar con otros validadores como not(sameAs("field)). |
withParams | $params, validator | es realmente un modificador de validadores. Añade un objeto $params al validador que se le da. Se puede usar en funciones de validación o incluso en objetos anidados de validación enteros. Útil para crear validadores personalizados. |
*Locator puede ser o bien una propiedad que tengamos definida, o una función. Cuando se da una función, this está enlazado a la instancia del componente, pudiendo utilizar sus propiedades y métodos, incluso en validaciones anidadas.
El bloque de validaciones se hace indicando cada campo a comprobar, que serán variables que tengamos definidas en el data, pasándole los validadores que queramos en forma de objeto, de esta manera:
import { required, requiredUnless, requiredIf, minLength, between } from "vuelidate/lib/validators"
...
validations: {
field: {
required: requiredUnless('isOptional')
},
nested: {
required: requiredIf(function (nestedModel) {
return !this.isOptional && nestedModel.someFlag
})
},
name: {
required,
minLength: minLength(4)
},
age: {
between: between(20, 30)
}
} |
Para hacer un validador personalizamos necesitamos una función que devuelva true o false, comprobando una condición. Nos los podemos definir como constantes en nuestro componente, antes del export default, o en archivos javascript externos si se van a reutilizar en diferentes componentes. Lo podemos hacer así, siendo value el valor de la variable a la que se enlzace el validador:
const esGuille = (value) => value == "Guille"; |
Utilizamos esta notación por mantenerlo simple, pero bien podríamos poner un bloque de código más complejo con { ... } y return, o utilizar function. Hay que tener en cuenta que el contexto de las funciones flecha y las normales son diferentes, para referenciar al componente en el que nos encontramos, sólo utilizando function() {...} podremos hacerlo utilizando this.
Para añadir parámetros, haríamos una función que encapsule a una como la que hemos visto, de esta forma:
const esGuilleUOtraCosa = (param) =>
(value) => value == "Guille" || value == param;
// ...
validations: {
myField: {
guilleOWilly: esGuilleUOtraCosa('Willy')
}
} |
En este caso, podríamos añadir varios parámetros sin problemas.
Para añadir algunas funciones a nuestros validadores personalizados, Vuelidate ofrece una serie de helpers, que tendremos que importar:
import { helpers } from 'vuelidate/lib/validators' |
Y la lista de helpers que ofrece es la siguiente:
| Helper | Descripción |
|---|---|
withParams | Permite añadir metadatos $params a tu función de validación. |
req | Versión mínima de required. Se utiliza para hacer que tu validador acepte campos opcionales. |
ref | Helper locator, permite referenciar a otros campos en el modelo. |
len | Obtiene la longitud de lo que se le pase, ya sea un array, string, o número de claves en un objeto. |
regex | Para creación de validadores con expresiones regulares. |
Un ejemplo de validador que hace uso de expresiones regulares sería el siguiente:
import { helpers } from 'vuelidate/lib/validators'
const alpha = helpers.regex('alpha', /^[a-zA-Z]*$/) |
Para más detalles, podemos consultar la documentación oficial de Vuelidate.