В Lit фреймворке Store представляет собой реактивное хранилище состояния, предназначенное для управления данными приложения и их автоматической синхронизации с компонентами. Оно реализует паттерн реактивного программирования, позволяя компонентам автоматически обновляться при изменении данных.
Для создания реактивного состояния используется функция
reactive из пакета lit:
import { reactive } from 'lit';
export const store = reactive({
count: 0,
user: {
name: 'Иван',
age: 25
}
});
Ключевой момент: любое изменение свойств объекта
store автоматически уведомляет подписанные
компоненты, что позволяет обновлять DOM без ручного
вмешательства.
Компоненты Lit могут использовать данные Store напрямую:
import { html, LitElement } from 'lit';
import { store } from './store.js';
class CounterComponent extends LitElement {
render() {
return html`
<div>Текущее значение: ${store.count}</div>
<button @click=${() => store.count++}>Увеличить</button>
`;
}
}
customElements.define('counter-component', CounterComponent);
При изменении store.count компонент
автоматически перерисуется, без необходимости вызывать
requestUpdate().
Store поддерживает глубокую реактивность для вложенных объектов:
store.user.name = 'Пётр';
Изменение name приведёт к обновлению всех компонентов,
использующих это свойство, даже если оно находится глубоко внутри
объекта.
Для работы с Store можно использовать не только прямое присваивание, но и вспомогательные функции:
function updateUserAge(age) {
store.user.age = age;
}
updateUserAge(30);
Это позволяет инкапсулировать логику изменения состояния и облегчает тестирование и поддержку кода.
Для крупных приложений рекомендуется разделять Store на модули:
// userStore.js
import { reactive } from 'lit';
export const userStore = reactive({
name: '',
age: 0
});
// counterStore.js
import { reactive } from 'lit';
export const counterStore = reactive({
count: 0
});
Такой подход снижает связанность компонентов и упрощает управление состоянием.
Lit позволяет создавать вычисляемые значения, основанные на Store:
import { computed } from 'lit';
import { store } from './store.js';
export const fullName = computed(() => `${store.user.name} (${store.user.age})`);
Компоненты, использующие fullName, будут автоматически
обновляться при изменении store.user.name или
store.user.age.
Store реализует оптимизированные механизмы отслеживания
изменений, что позволяет минимизировать количество перерисовок.
Lit отслеживает только используемые свойства: если
компонент использует store.user.name, изменение
store.user.age не вызовет лишнего рендера.
Store легко интегрируется с асинхронными операциями:
async function fetchUserData() {
const response = await fetch('/api/user');
const data = await response.json();
store.user = data;
}
fetchUserData();
После обновления store.user все компоненты, подписанные
на его свойства, автоматически обновляются.
Store в Lit является мощным инструментом для построения реактивного и масштабируемого фронтенда, позволяя писать компактный и легко поддерживаемый код, минимизируя ручное управление состоянием и синхронизацией интерфейса.