Фреймворк Lit построен вокруг концепции реактивного обновления пользовательского интерфейса. Основной механизм этой реактивности — свойства компонентов, изменения которых автоматически отражаются на DOM. Понимание работы реактивных свойств является ключевым для эффективного использования Lit.
Реактивные свойства в Lit создаются с помощью статического геттера
properties в классе компонента:
import { LitElement, html, css } from 'lit';
class MyComponent extends LitElement {
static properties = {
name: { type: String },
age: { type: Number },
isActive: { type: Boolean }
};
constructor() {
super();
this.name = 'Иван';
this.age = 25;
this.isActive = true;
}
render() {
return html`
<p>Имя: ${this.name}</p>
<p>Возраст: ${this.age}</p>
<p>Активен: ${this.isActive}</p>
`;
}
}
customElements.define('my-component', MyComponent);
Ключевые моменты:
properties.type определяет тип данных и влияет на
сериализацию при работе с атрибутами.Lit поддерживает несколько типов данных, которые обеспечивают корректную конвертацию между атрибутами и свойствами:
true.Любое изменение реактивного свойства автоматически инициирует повторный рендер компонента. Это работает через сеттеры, генерируемые Lit:
this.name = 'Пётр'; // автоматически вызовет обновление render()
this.age += 1; // изменится значение в DOM
Особенности обновления:
Можно перехватывать изменения через метод
updated(changedProperties):
updated(changedProperties) {
if (changedProperties.has('age')) {
console.log(`Возраст изменился с ${changedProperties.get('age')} на ${this.age}`);
}
}
changedProperties — карта предыдущих значений
свойств.Для контроля, будет ли обновление рендерить компонент, используется
метод shouldUpdate(changedProperties):
shouldUpdate(changedProperties) {
return changedProperties.has('name'); // рендер только если изменилось имя
}
Реактивные свойства могут быть связаны с HTML-атрибутами, что позволяет задавать начальные значения в разметке:
<my-component name="Анна" age="30"></my-component>
<my-component is-active></my-component> →
isActive = true.type.Для объектов и массивов необходимо использовать иммутабельные обновления, чтобы Lit заметил изменение:
this.items = [...this.items, newItem]; // триггер обновления
this.settings = { ...this.settings, theme: 'dark' };
this.items.push(...)) не вызовет перерисовку.Lit поддерживает использование декораторов для упрощения объявления свойств:
import { LitElement, html } from 'lit';
import { property } from 'lit/decorators.js';
class MyComponent extends LitElement {
@property({ type: String }) name = 'Иван';
@property({ type: Number }) age = 25;
render() {
return html`<p>${this.name} - ${this.age}</p>`;
}
}
shouldUpdate.Реактивные свойства позволяют строить сложные интерфейсы с минимальной ручной работой:
Эта система обеспечивает простоту и предсказуемость реактивного обновления без необходимости внешних библиотек управления состоянием.