Нормализация состояния

Нормализация состояния в 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 предоставляет ряд встроенных механизмов для управления состоянием:

  1. @observable и @attr Основные инструменты наблюдения за изменениями данных. Позволяют реактивно синхронизировать DOM.

  2. $emit для событий Для извещения внешнего мира о внутренних изменениях состояния используется метод $emit, который отправляет кастомные события.

this.$emit('count-changed', { value: this.count });
  1. updated и update Методы жизненного цикла, которые вызываются после изменения состояния. Их можно использовать для дополнительной нормализации или валидации данных перед обновлением DOM.
updated(changedProperties) {
  if (changedProperties.has('count')) {
    console.log(`Состояние count изменилось на ${this.count}`);
  }
}

Управление сложным состоянием

Для компонентов с большим количеством реактивных свойств или вложенной структурой данных важно нормализовать состояние централизованно. Это включает:

  • Разделение состояния на отдельные объекты или классы.
  • Использование computed-свойств для вычисляемых значений.
  • Применение методов валидации при обновлении данных.
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

  1. Предсказуемость: каждое изменение свойства ведет к локализованному обновлению DOM.
  2. Производительность: минимальное количество операций перерисовки благодаря реактивной системе.
  3. Модульность: компоненты могут работать независимо и синхронизироваться через события.
  4. Простота тестирования: централизованное состояние легко проверять отдельно от UI.

Нормализация состояния является фундаментом для создания стабильных и масштабируемых приложений на FAST Element, обеспечивая плавную реактивность и надежную синхронизацию между данными и интерфейсом.