Нормализация состояния в FAST Element — это процесс упорядочивания и синхронизации внутреннего состояния компонентов с их визуальным представлением и реактивными свойствами. В основе лежит концепция реактивных свойств, которая позволяет автоматически обновлять DOM при изменении данных. FAST Element обеспечивает мощный механизм для управления состоянием, минимизируя ручное вмешательство и ошибки синхронизации.
В FAST Element состояние компонента определяется реактивными
свойствами. Каждое свойство компонента, помеченное декоратором
@attr или @observable, становится
автоматически наблюдаемым.
import { FASTElement, html, css, observable } from '@microsoft/fast-element';
class Counter extends FASTElement {
@observable count = 0;
increment() {
this.count++;
}
}
Изменение count автоматически приводит к обновлению
шаблона:
const template = html<Counter>`
<div>Счётчик: ${x => x.count}</div>
<button @click=${x => x.increment()}>Увеличить</button>
`;
Ключевой момент: любые изменения реактивного свойства инициируют обновление DOM только там, где это свойство используется, что делает нормализацию состояния локализованной и предсказуемой.
FAST Element поддерживает двунаправленную синхронизацию между свойствами компонента и его HTML-атрибутами. Это позволяет внешнему коду взаимодействовать с состоянием через DOM без нарушения внутренней логики.
import { attr } from '@microsoft/fast-element';
class ToggleButton extends FASTElement {
@attr({ mode: 'boolean' }) pressed = false;
toggle() {
this.pressed = !this.pressed;
}
}
При изменении pressed атрибут pressed на
DOM-элементе автоматически обновляется. Аналогично, если атрибут
меняется извне, реактивное свойство синхронизируется с ним.
FAST Element предоставляет ряд встроенных механизмов для управления состоянием:
@observable и @attr
Основные инструменты наблюдения за изменениями данных. Позволяют
реактивно синхронизировать DOM.
$emit для событий Для извещения
внешнего мира о внутренних изменениях состояния используется метод
$emit, который отправляет кастомные
события.
this.$emit('count-changed', { value: this.count });
updated и update Методы
жизненного цикла, которые вызываются после изменения состояния. Их можно
использовать для дополнительной нормализации или валидации данных перед
обновлением DOM.updated(changedProperties) {
if (changedProperties.has('count')) {
console.log(`Состояние count изменилось на ${this.count}`);
}
}
Для компонентов с большим количеством реактивных свойств или вложенной структурой данных важно нормализовать состояние централизованно. Это включает:
class FormState {
@observable username = '';
@observable email = '';
get isValid() {
return this.username.length > 0 && /\S+@\S+\.\S+/.test(this.email);
}
}
class UserForm extends FASTElement {
state = new FormState();
submit() {
if (this.state.isValid) {
console.log('Форма валидна');
}
}
}
Использование отдельного объекта состояния упрощает тестирование, отладку и предотвращает рассинхронизацию между различными частями компонента.
FAST Element активно использует кастомные события для нормализации взаимодействия между компонентами. Компоненты могут слушать события от дочерних элементов и обновлять своё состояние в ответ на изменения:
class ParentComponent extends FASTElement {
count = 0;
handleCountChanged(event) {
this.count = event.detail.value;
}
}
Привязка события в шаблоне:
html<ParentComponent>`
<counter @count-changed=${x => x.handleCountChanged}></counter>
<div>Текущее значение: ${x => x.count}</div>
`
Это гарантирует, что все части интерфейса остаются синхронизированными.
@attr для данных, доступных извне через
DOM.update или updated.Нормализация состояния является фундаментом для создания стабильных и масштабируемых приложений на FAST Element, обеспечивая плавную реактивность и надежную синхронизацию между данными и интерфейсом.