Lit — это современный веб-фреймворк для создания компонент на основе стандартов Web Components. Одной из ключевых возможностей Lit является реактивное связывание данных с шаблонами через интерполяцию и выражения внутри шаблонных литералов.
Шаблоны в Lit создаются с помощью функции html из пакета
lit. Интерполяция данных осуществляется через синтаксис
${...}, который позволяет внедрять JavaScript-выражения
прямо в HTML.
import { html, LitElement } from 'lit';
import { customElement, property } from 'lit/decorators.js';
@customElement('user-card')
class UserCard extends LitElement {
@property({ type: String }) name = 'Иван';
@property({ type: Number }) age = 30;
render() {
return html`
<div>
<p>Имя: ${this.name}</p>
<p>Возраст: ${this.age}</p>
</div>
`;
}
}
В этом примере значения name и age
автоматически подставляются в шаблон. Любое изменение свойства
инициирует повторный рендер компонента, благодаря реактивной системе
Lit.
В Lit можно использовать любые JavaScript-выражения внутри
${...}:
render() {
const items = ['яблоко', 'банан', 'вишня'];
return html`
<ul>
${items.map(item => html`<li>${item.toUpperCase()}</li>`)}
</ul>
<p>${this.age >= 18 ? 'Взрослый' : 'Ребенок'}</p>
`;
}
map,
filter) упрощают генерацию списков.Ключевым механизмом Lit является реактивность через декоратор
@property. Любое изменение реактивного свойства
автоматически инициирует обновление DOM.
@property({ type: Boolean }) isActive = false;
render() {
return html`
<button @click=${() => this.isActive = !this.isActive}>
${this.isActive ? 'Активен' : 'Не активен'}
</button>
`;
}
В этом примере кнопка обновляет текст при каждом клике. Использование тернарного оператора внутри интерполяции обеспечивает динамическую замену контента без прямой работы с DOM.
Lit позволяет связывать не только текстовые узлы, но и атрибуты HTML:
render() {
return html`
<input type="text" .value=${this.name} placeholder="Введите имя">
<button ?disabled=${!this.name}>Отправить</button>
`;
}
. связывает свойство DOM, а не
атрибут.? связывает логическое
свойство, например disabled,
checked.Интерполяция ${...} поддерживает вызовы методов
компонента, что позволяет инкапсулировать логику:
getGreeting(name) {
return `Привет, ${name.toUpperCase()}!`;
}
render() {
return html`<p>${this.getGreeting(this.name)}</p>`;
}
Вызов метода внутри шаблона делает код более чистым и поддерживаемым, особенно при сложной логике отображения.
${...} для внедрения значений и вычислений
в шаблон.map и создавать вложенные шаблоны
`html```.. и ? для
корректного связывания свойств и логических атрибутов.Интерполяция в Lit обеспечивает мощный и гибкий способ связывания данных с DOM, упрощая создание реактивных веб-компонентов с минимальным количеством кода и высокой читаемостью.