Состояние результата в Vest формируется как итог выполнения тестового набора и представляет собой структурированный объект, содержащий информацию о валидности, ошибках, предупреждениях и текущих асинхронных процессах. Работа с этим состоянием строится вокруг набора предикатов и селекторов, позволяющих определить статус всей формы или отдельных её полей без необходимости ручного обхода внутренних структур.
Результат выполнения validation suite в Vest представляет собой объект, содержащий несколько ключевых категорий данных:
Основной принцип заключается в том, что состояние всегда вычисляется детерминированно на основе выполненных правил, а не изменяется вручную.
Ключевыми свойствами обычно выступают:
isValid — итоговая валидность набораerrors — структура ошибок по полямwarnings — предупреждения, не блокирующие
валидностьpending — наличие незавершённых асинхронных
проверокtests — результаты отдельных проверокНаиболее часто используемый метод определения состояния — проверка общей валидности результата.
Логическое свойство isValid позволяет определить, прошла
ли форма все правила проверки без ошибок:
if (result.isValid) {
// все проверки пройдены
}
Данный флаг вычисляется на основе отсутствия ошибок в структуре
errors. Даже при наличии предупреждений результат может
считаться валидным, поскольку warnings не влияют на блокирующую
логику.
Противоположное состояние часто проверяется через отрицание:
if (!result.isValid) {
// есть ошибки валидации
}
Такой подход используется в сценариях блокировки отправки формы или отображения сообщений об ошибках.
Ошибки в Vest структурируются по полям, что позволяет точно
определять проблемные участки данных. Объект errors обычно
имеет вид отображения ключей полей на массивы сообщений.
Проверка наличия ошибок в целом:
const hasErrors = Object.keys(result.errors).length > 0;
Однако в рамках Vest чаще применяется готовая логика:
if (result.hasErrors) {
// существуют ошибки
}
Некоторые реализации используют производные селекторы для проверки конкретных полей:
const emailErrors = result.errors.email;
const hasEmailError = Boolean(emailErrors);
Подобный подход позволяет локализовать обработку ошибок на уровне UI-компонентов.
Предупреждения отделяются от ошибок и не влияют на итоговую валидность, но могут использоваться для отображения дополнительной информации пользователю.
Проверка наличия предупреждений:
const hasWarnings = Object.keys(result.warnings).length > 0;
Либо через предикат:
if (result.hasWarnings) {
// есть предупреждения
}
Предупреждения часто применяются в сценариях частичной валидации, когда данные допустимы, но требуют уточнения или рекомендаций.
Одной из ключевых особенностей Vest является поддержка асинхронной
валидации. Это приводит к появлению промежуточного состояния
pending, которое указывает на незавершённые проверки
(например, запросы к серверу).
Проверка выполняется через:
if (result.pending) {
// идёт асинхронная проверка
}
Также часто используется отрицательная форма:
if (!result.pending) {
// все проверки завершены
}
Это состояние критично для предотвращения преждевременной отправки формы, когда часть данных ещё не прошла серверную проверку уникальности или доступности.
Vest предоставляет возможность проверять статус не только всей формы, но и отдельных полей. Это особенно важно при построении реактивных интерфейсов.
Пример проверки валидности конкретного поля:
const isEmailValid = !result.errors.email;
Проверка наличия ошибок у поля:
const hasEmailError = Boolean(result.errors.email);
Проверка предупреждений для поля:
const hasEmailWarning = Boolean(result.warnings.email);
Подобная гранулярность позволяет строить интерфейсы, где каждое поле независимо отображает свой статус.
Для упрощения работы с результатом часто используются производные функции, которые инкапсулируют логику проверки статуса.
Пример логического селектора:
const isFormValid = (result) => result.isValid && !result.pending;
Такой подход позволяет учитывать не только отсутствие ошибок, но и завершённость всех асинхронных операций.
Другой вариант:
const isFormReadyToSubmit = (result) =>
result.isValid && Object.keys(result.errors).length === 0 && !result.pending;
Эти селекторы часто применяются в архитектуре UI-слоя для унификации условий отправки данных.
Каждое правило в Vest представлено тестом, результат которого
сохраняется в объекте tests. Это позволяет анализировать
состояние на уровне отдельных проверок.
Пример структуры:
tests: {
email: [
{ message: "Invalid email", passed: false },
{ message: "Required", passed: true }
]
}
Проверка статуса конкретного теста:
const emailTests = result.tests.email;
const hasFailedEmailTests = emailTests.some(t => !t.passed);
Этот уровень детализации используется в сложных формах, где важно понимать не только факт ошибки, но и её источник.
Состояние проверки часто используется в связке с реактивными библиотеками. Логика строится вокруг автоматического пересчёта статуса при изменении данных.
Типичный сценарий:
const canSubmit = result.isValid && !result.pending;
<button disabled={!canSubmit}>
Отправить
</button>
При этом важно учитывать, что isValid не всегда
достаточно, поскольку асинхронные проверки могут находиться в процессе
выполнения.
В реальных приложениях статус часто определяется комбинацией нескольких факторов:
Пример:
const isReady =
result.isValid &&
!result.pending &&
Object.keys(result.errors).length === 0;
Такая композиция позволяет точно контролировать момент перехода формы в состояние готовности.
Иногда результат проверки деструктурируется для удобства работы:
const { isValid, errors, pending, warnings } = result;
Далее логика строится на основе локальных переменных, что упрощает чтение условий:
const hasBlockingIssues = !isValid || pending;
Подобный стиль часто применяется в крупных формах с множеством зависимых полей.
При динамической валидации важно отслеживать изменения статуса:
const wasValid = previous.isValid;
const isNowValid = result.isValid;
const becameValid = !wasValid && isNowValid;
Это позволяет запускать побочные эффекты при переходе формы в корректное состояние, например активацию кнопок или автосохранение.
При анализе результата проверки используется иерархия состояний:
Такой порядок важен для UI-логики, где незавершённые операции имеют более высокий приоритет, чем итоговая валидность.
if (result.pending) {
// блокировка действий
} else if (result.hasErrors) {
// отображение ошибок
} else if (result.hasWarnings) {
// отображение рекомендаций
}
В формах с вложенными структурами данных статус может проверяться на уровне сегментов:
const addressValid = !result.errors.address;
const userValid = !result.errors.user;
Затем формируется общий статус:
const formValid = addressValid && userValid;
Такой подход позволяет распределять ответственность между частями формы и избегать монолитной логики проверки.