FAST Element предоставляет мощный инструмент для создания настраиваемых веб-компонентов с использованием реактивного состояния. Одной из ключевых особенностей является управление состоянием валидации, что особенно важно при работе с формами и пользовательским вводом. Состояние валидации определяет, является ли текущий ввод корректным, некорректным или частично допустимым, и напрямую влияет на поведение компонента и его визуальное представление.
FAST Element использует реактивные свойства, чтобы
отслеживать изменения данных и автоматически обновлять DOM. Для
валидации чаще всего применяются свойства типа validity и
invalidMessage, которые могут быть связаны с атрибутами
элемента.
validity — объект, описывающий текущее состояние
валидности, аналогичный встроенному ValidityState в
HTML.invalidMessage — строка, содержащая сообщение об
ошибке, которое можно отображать в интерфейсе.Пример декларации реактивного свойства для состояния валидации:
import { FASTElement, html, css, observable } from "@microsoft/fast-element";
export class MyInput extends FASTElement {
@observable value = "";
@observable invalidMessage = "";
get validity() {
return this.invalidMessage === "" ? { valid: true } : { valid: false };
}
validate() {
if (this.value.trim() === "") {
this.invalidMessage = "Поле не может быть пустым";
} else {
this.invalidMessage = "";
}
}
}
Здесь @observable делает свойства реактивными, а метод
validate обновляет состояние валидации в зависимости от
текущего значения value.
FAST Element позволяет связывать реактивные свойства с шаблоном через bindings, что обеспечивает автоматическое обновление интерфейса при изменении состояния.
const template = html<MyInput>`
<label>
Введите текст:
<input
type="text"
value="${x => x.value}"
@input="${(x, c) => { x.value = c.event.target.value; x.validate(); }}"
/>
</label>
<div class="error-message" ?hidden="${x => x.validity.valid}">
${x => x.invalidMessage}
</div>
`;
?hidden управляет видимостью блока с
ошибкой.x.validate() на событие input
обеспечивает динамическую проверку по мере ввода данных.FAST Element предоставляет возможность интеграции с
встроенными валидаторами HTML, такими как
required, pattern, minlength,
maxlength. Для этого можно использовать сочетание
ConstraintValidation и реактивного свойства.
validate() {
const input = this.shadowRoot.querySelector("input");
if (!input.checkValidity()) {
this.invalidMessage = input.validationMessage;
} else {
this.invalidMessage = "";
}
}
Использование встроенных валидаторов снижает объем кастомного кода и обеспечивает консистентное поведение с нативными элементами формы.
Для сложной логики можно создавать кастомные валидаторы. Например, проверка уникальности значения:
async validateUnique() {
const isUnique = await checkValueUniqueness(this.value);
if (!isUnique) {
this.invalidMessage = "Значение уже используется";
} else {
this.invalidMessage = "";
}
}
Важно учитывать, что асинхронные проверки требуют корректной синхронизации с реактивной системой FAST, чтобы обновления интерфейса происходили автоматически.
Состояние валидации тесно связано с визуальной обратной связью. FAST Element позволяет динамически менять классы и стили через биндинги:
input:invalid {
border-color: red;
}
input:valid {
border-color: green;
}
В шаблоне можно привязать класс к состоянию валидации:
<input
class="${x => x.validity.valid ? 'valid' : 'invalid'}"
value="${x => x.value}"
@input="${(x, c) => { x.value = c.event.target.value; x.validate(); }}"
/>
Таким образом, визуальная реакция на ошибки становится реактивной и согласованной с внутренним состоянием компонента.
Часто требуется проверять поле по нескольким правилам одновременно. В FAST Element можно создавать композитное состояние валидности, объединяя результаты разных валидаторов:
validate() {
this.invalidMessage = "";
if (this.value.length < 5) {
this.invalidMessage = "Минимальная длина — 5 символов";
return;
}
if (!/^[a-zA-Z]+$/.test(this.value)) {
this.invalidMessage = "Допустимы только латинские буквы";
return;
}
// Асинхронная проверка уникальности
this.validateUnique();
}
Каждый шаг последовательно обновляет invalidMessage, а
интерфейс автоматически отражает текущее состояние.
Эффективное управление состоянием валидации в FAST Element обеспечивает согласованность данных, гибкость интерфейса и чистый, поддерживаемый код при создании кастомных компонентов форм.