Локальное состояние является ключевым механизмом управления данными внутри компонента FAST Element. Оно позволяет отслеживать и автоматически реагировать на изменения свойств, обеспечивая декларативное обновление DOM без необходимости ручного вмешательства в рендеринг.
FAST Element использует реактивные свойства
(@observable), которые автоматически уведомляют систему о
любых изменениях. Объявление свойства в классе компонента осуществляется
с помощью декоратора @observable или через статический
метод define при использовании
FASTElement:
import { FASTElement, html, observable } from "@microsoft/fast-element";
class Counter extends FASTElement {
@observable count = 0;
}
Каждое реактивное свойство отслеживает изменения и вызывает обновление шаблона, в котором оно используется.
FAST Element применяет декларативные привязки, позволяющие синхронизировать свойства компонента с DOM. Основные виды привязок:
:) – от
свойства к элементу DOM.=) –
синхронизация в обе стороны.@) – вызов метода
при событии DOM.Пример использования локального состояния в шаблоне:
const template = html<Counter>`
<div>
<p>Текущее значение: ${x => x.count}</p>
<button @click="${x => x.increment()}">Увеличить</button>
</div>
`;
class Counter extends FASTElement {
@observable count = 0;
increment() {
this.count += 1;
}
}
При изменении свойства count автоматически обновляется
текст в параграфе.
Для более сложной логики используется метод
propertyChanged, который можно определить
для обработки изменений:
class Counter extends FASTElement {
@observable count = 0;
countChanged(oldValue, newValue) {
console.log(`Count изменился с ${oldValue} на ${newValue}`);
}
}
Этот метод вызывается каждый раз при изменении свойства
count, что позволяет выполнять побочные эффекты без
дополнительной ручной логики.
Для скрытого состояния компонента можно использовать обычные приватные поля класса:
class Toggle extends FASTElement {
#isActive = false;
toggle() {
this.#isActive = !this.#isActive;
this.requestUpdate();
}
}
Метод requestUpdate() инициирует ререндеринг шаблона,
даже если используется приватное поле, не объявленное реактивным.
FAST Element оптимизирует процесс обновления DOM:
@observable с отдельными реактивными методами
(splice, push) или заменой массива целиком,
чтобы система отследила изменения.Свойства компонента можно синхронизировать с HTML-атрибутами через декларацию свойства:
class MyElement extends FASTElement {
@observable value = "";
static override define = {
attributes: ["value"]
};
}
Изменение атрибута <my-element value="новое">
автоматически обновит свойство value, и наоборот.
Для интеграции с другими компонентами можно испускать кастомные события при изменении состояния:
class Counter extends FASTElement {
@observable count = 0;
increment() {
this.count += 1;
this.$emit('count-changed', { detail: this.count });
}
}
Метод $emit упрощает создание и распространение событий,
сохраняя синтаксис компактным и декларативным.
@observable для реактивных свойств.<propertyName>Changed методы.requestUpdate().Эти принципы создают гибкую, производительную и предсказуемую архитектуру компонентов FAST Element, позволяя управлять локальным состоянием эффективно и безопасно.