...
| Bloque de código | ||
|---|---|---|
| ||
setup() {
return { v$: useVuelidate() };
}, |
...
Ese v$ que se define contendrá toda la información de las validaciones que especifiquemos, así como algunos métodos. Podremos acceder a él con this.$v.
Validadores
Estableceremos las diferentes validaciones que queremos que se hagan sobre variables que estén incluidas en el data del componente, especificándolas en un campo validations dentro del export default defineComponent({ ... }), así:
| Bloque de código | ||
|---|---|---|
| ||
validations: {
nombre: {
required: required$,
minLength: minLength$(4),
maxLength: maxLength$(500),
},}, |
En este caso, "nombre" es la variable que estaría definida dentro del data del componente, y required, minLength y maxLength son las validaciones que se le aplican.
Los validadores son las comprobaciones que se harán sobre las variables que especifiquemos, y por defecto Vuelidate proporciona los siguientes:
...
Vuelidate proporciona algunos validadores por defecto (podemos verlos todos en su documentación), que los podemos importar así:
| Bloque de código | ||
|---|---|---|
| ||
import { required, maxLength, minLength } from '@vuelidate/validators' |
También podemos definir nosotros nuestros propios validadores. Dentro del proyecto del Portal-UI hay definidos algunos en src/shared/validations/validators.js, que los importaremos y utilizaremos de la misma manera, poniendo el import de esa ruta. Algunos se redefinen simplemente especificándoles el mensaje de error, por ejemplo:
| Bloque de código | ||
|---|---|---|
| ||
export const minLength$ = (min) => helpers.withMessage(i18n.global.t('minLength', { min }), minLength(min)); |
Y si no, podemos definir nuestros propios métodos de validación haciendo un método que reciba un valor y devuelva un booleano. Podemos ver más detalles en su documentación, si queremos, por ejemplo, incluir parámetros extra en los métodos de validación.
Activar validadores
Como veremos en el siguiente apartado, en el template pintaremos los casos de error en el caso de que no se cumplan las validaciones, pero inicialmente no querremos que se muestren (por ejemplo, un campo required inicialmente estará vacío, sólo mostraremos el aviso una vez el usuario haya intentado hacer submit y no haya rellenado ese campo). Para controlar esto, $v contiene, para cada variable que validamos, un campo $invalid que nos dirá si en todo momento si el valor de la variable pasa las validaciones que hayamos especificado, y un campo $dirty que será false hasta que activemos las validaciones, para así poder controlar si se muestran mensajes de error o todavía no.
Para activar las validaciones, dentro del método que hayamos puesto en @submit.prevent llamaremos al método this.$v.$touch(), lo que hará que los campos $dirty pasen a true.
Ejemplo de template
Teniendo en cuenta lo anterior, podemos ver este ejemplo:
| Bloque de código |
|---|
<form @submit.prevent="checkSubmit" class="form">
<!-- Nombre del titular -->
<div class="form__row width100" style="margin-top: 1em">
<!-- Ejemplo sin el label del campo para simplificar -->
<!-- Mensaje de error -->
<div v-if="v$.nombre.$dirty && v$.nombre.$invalid">
<div
v-for="(error, index) in v$.nombre.$errors"
:key="index"
class="form__error"
>* {{ error.$message }}</div
>
</div>
<!-- Campo InputText -->
<div class="form__field width100">
<InputText
v-model="nombre"
class="width100"
maxlength="500"
:class="
v$.nombre.$dirty && v$.nombre.$invalid
? 'border-invalid'
: ''
"
/>
</div>
</div>
</form> |
Como podemos ver, para mostrar el mensaje de error se comprueba tanto si el valor de la variable nombre es inválido como que se hayan activado las validaciones, es decir, el campo dirty. Entonces, el campo $errors contiene los diferentes errores de las validaciones que fallan, y cada uno de ellos contiene el campo $message con el mensaje de error que tenga definido, que es lo que se pinta
*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:
| Bloque de código | ||
|---|---|---|
| ||
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)
}
} |
Validaciones personalizadas
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:
| Bloque de código | ||
|---|---|---|
| ||
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:
| Bloque de código | ||
|---|---|---|
| ||
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.
Helpers
Para añadir algunas funciones a nuestros validadores personalizados, Vuelidate ofrece una serie de helpers, que tendremos que importar:
| Bloque de código | ||
|---|---|---|
| ||
import { helpers } from 'vuelidate/lib/validators' |
Y la lista de helpers que ofrece es la siguiente:
...
Un ejemplo de validador que hace uso de expresiones regulares sería el siguiente:
| Bloque de código | ||
|---|---|---|
| ||
import { helpers } from 'vuelidate/lib/validators'
const alpha = helpers.regex('alpha', /^[a-zA-Z]*$/) |
...
.