FAST Element предоставляет мощный механизм работы с веб-компонентами, позволяющий эффективно управлять изменениями данных и обновлениями DOM. Одной из ключевых концепций, обеспечивающих высокую производительность, являются batch-обновления — группировка изменений для минимизации лишних перерасчетов и перерисовки.
Каждое свойство в FAST Element отслеживается с помощью реактивной системы. Когда значение свойства изменяется, библиотека автоматически планирует обновление компонента. Без batch-обновлений каждое изменение свойства могло бы инициировать отдельный цикл обновления DOM, что снижает производительность при множественных изменениях.
Batch-обновление объединяет несколько изменений в одну операцию, обеспечивая:
В FAST Element это реализовано через систему очередей обновлений.
FAST Element использует внутренний механизм microtask-очереди, чтобы выполнять обновления после завершения текущего стека вызовов. Принцип работы:
requestUpdate().update() и
перерисовку DOM.Пример кода, демонстрирующий batch-обновления:
import { FASTElement, html, css } from "@microsoft/fast-element";
const template = html<MyComponent>`
<div>Счётчик: ${x => x.count}</div>
`;
class MyComponent extends FASTElement {
count = 0;
increment() {
this.count += 1;
this.count += 1;
this.count += 1;
}
}
FASTElement.define({
name: "my-component",
template,
styles: css`div { color: blue; }`,
type: MyComponent
});
В методе increment() три изменения свойства
count будут объединены в одну отрисовку,
благодаря batch-обновлению. В DOM появится значение 3 после
одного обновления, а не три отдельных перерисовки.
requestUpdate() для ручного контроляВ некоторых случаях требуется явный контроль за обновлениями,
например, при работе с асинхронными данными или сложными вычислениями.
FAST Element предоставляет метод
requestUpdate(), который позволяет:
Promise, который разрешается после
завершения обновления.Пример:
async fetchData() {
const response = await fetch("/data.json");
this.data = await response.json();
await this.requestUpdate("data"); // Обновление DOM после загрузки данных
console.log("Компонент обновлён с новыми данными");
}
Использование requestUpdate() обеспечивает точную
синхронизацию состояния компонента с его визуальным представлением.
Для больших интерфейсов с множеством компонентов рекомендуется:
Пример computed-свойства:
import { FASTElement, observable, computed } from "@microsoft/fast-element";
class CartComponent extends FASTElement {
@observable items = [];
@computed get total() {
return this.items.reduce((sum, item) => sum + item.price, 0);
}
}
Здесь любое изменение массива items инициирует пересчёт
total, который будет включён в batch-обновление,
предотвращая множественные обновления DOM.
FAST Element обеспечивает корректное взаимодействие batch-обновлений с событиями:
updated вызывается один раз для всех
изменений.Пример:
class MyCounter extends FASTElement {
count = 0;
increment() {
this.count += 1;
this.count += 2;
this.addEventListener('updated', () => console.log('Обновление завершено'));
}
}
В консоли будет выведено одно сообщение после объединённого обновления, а не несколько.
Batch-обновления критичны для высокой производительности интерфейсов с большим числом реактивных компонентов:
В сочетании с requestUpdate() и computed-свойствами
batch-обновления позволяют создавать масштабируемые и отзывчивые
веб-компоненты без лишней нагрузки на браузер.
Batch-обновления в FAST Element являются ядром реактивной системы и обеспечивают эффективное управление состоянием и DOM, позволяя создавать высокопроизводительные, масштабируемые веб-приложения.