Skip to content

Валидация Форм

Для валидации формы используется метод validate, который возвращает логическое значение - является ли форма валидной. В процессе выполнения данного метода происходи проверка всех дочерних элементов на валидность. В них также вызывается методов validate, если такой представлен. Так происходит и для следующих дочерних элементов и так далее вглубь.

vue
<template>
	<form-field name = "age" :validation = "ageValidation"/>
</template>
<script setup>
import {Form, FormField} from "jenesius-vue-form";

function ageValidation(x) {
	return x > 17 || 'So small'
}

form.setValues({ age: 17 });
form.validate() // false

form.setValues({ age: 24 });
form.validate() // true
</script>
<template>
	<form-field name = "age" :validation = "ageValidation"/>
</template>
<script setup>
import {Form, FormField} from "jenesius-vue-form";

function ageValidation(x) {
	return x > 17 || 'So small'
}

form.setValues({ age: 17 });
form.validate() // false

form.setValues({ age: 24 });
form.validate() // true
</script>

Для валидации поля, FormField принимает один обязательный параметр:

validation Обязательный

Имеет следующий тип:

ts
interface FormFieldProps {
	validation: FormFieldValidationCallback[] | FormFieldValidationCallback 
}
interface FormFieldProps {
	validation: FormFieldValidationCallback[] | FormFieldValidationCallback 
}

Как видно из спецификации поле может принимать как одиночную функцию, так и массив функций. Тип функции описан ниже:

ts
type FormFieldValidationCallback = (value: any) => true | string | boolean
type FormFieldValidationCallback = (value: any) => true | string | boolean
  • Если функция вернула true - поля ввода является валидным, в ином другом случае - нет.
  • Если передан массив функций, то они будут запущены друг за другом и поле будет являться валидным, если все функции вернут true.

Примеры Валидации

Ограничение размеров

vue
<template>
	<form-field name = "token" :validation = "validation"/>
</template>
<script setup>
import {FormField, Form} from "jenesius-vue-form";

const validation = [
	x => x.length > 5 || "Длина значения должна быть больше 5 символов.",
    x => x.length < 25 || "Длина значения должна быть меньше 25."
]
</script>
<template>
	<form-field name = "token" :validation = "validation"/>
</template>
<script setup>
import {FormField, Form} from "jenesius-vue-form";

const validation = [
	x => x.length > 5 || "Длина значения должна быть больше 5 символов.",
    x => x.length < 25 || "Длина значения должна быть меньше 25."
]
</script>

Проверка зависимости двух полей

В данном примере демонстрируется как можно использовать валидацию поля, которое зависит от значения другого поля. В приведённом примере существует два правила:

  • Если переключатель установлен в true, то для Login используется правило администратора: логин администратора начинается с $.
  • Если переключатель выключен, то для Login используется правило пользователя: длинна строки должна быть больше 5.
vue
<template>
	<form-field type="switch" name="isAdmin"/>
	<form-field name="login" :validation="validation"/>
</template>
<script setup>
import {FormField, Form, ComputedValue} from "jenesius-vue-form";

const form = new Form();
const isAdmin = ComputedValue(form, "isAdmin"); // Для реактивной связи
const validation = [
	login => {
	    if (isAdmin.value && !login.startsWith('$'))
			return 'Имя администратора должно начинаться с $';
		if (!isAdmin.value && login.length < 5)
			return 'Имя пользователя должно иметь длину минимум 5 символов.'
		
        return true;
    }
]
</script>
<template>
	<form-field type="switch" name="isAdmin"/>
	<form-field name="login" :validation="validation"/>
</template>
<script setup>
import {FormField, Form, ComputedValue} from "jenesius-vue-form";

const form = new Form();
const isAdmin = ComputedValue(form, "isAdmin"); // Для реактивной связи
const validation = [
	login => {
	    if (isAdmin.value && !login.startsWith('$'))
			return 'Имя администратора должно начинаться с $';
		if (!isAdmin.value && login.length < 5)
			return 'Имя пользователя должно иметь длину минимум 5 символов.'
		
        return true;
    }
]
</script>

Released under the MIT License.