Определение свойств компонента в Slim.js
Slim.js поддерживает декларативное определение свойств, позволяя компонентам синхронизировать внутреннее состояние с DOM и родительским окружением. Свойства компонента выступают связующим механизмом между логикой и представлением, избавляя от избыточного кода для обновления интерфейса.
Свойства объявляются статическим объектом properties
внутри класса компонента. Ключи объекта соответствуют именам свойств, а
значения определяют поведение и типизацию.
import 'slim-js';
class Counter extends Slim {
static properties = {
count: { type: Number, value: 0 },
label: { type: String, value: 'Clicks' }
};
}
customElements.define('x-counter', Counter);
Ключевые параметры:
type — преобразование значения свойства к указанному
типу.value — значение по умолчанию.Slim.js приводит значения автоматически, уменьшая вероятность ошибок при передаче данных в компонент.
Каждое свойство в Slim.js реактивно. Изменение свойства вызывает
автоматическое обновление шаблона, если оно присутствует в разметке.
Дополнительная логика обновления может быть реализована методом
onRender, который вызывается после перерисовки.
onRender() {
console.log(`Текущее значение: ${this.count}`);
}
Обновление свойства может выполняться напрямую:
this.count++;
Slim.js обработает изменение и синхронизирует представление.
Свойства могут быть связаны с атрибутами HTML. Это обеспечивает передачу данных через разметку и интеграцию с другими веб-компонентами или внешними фреймворками.
static properties = {
active: { type: Boolean, reflectToAttribute: true }
};
Особенности отражения:
reflectToAttribute: true значение свойства
сериализуется в атрибут.Значение value применяется при создании экземпляра
компонента, формируя предсказуемое состояние. Вложенная инициализация
состояния избавляет от дополнительного кода в конструкторе.
static properties = {
size: { type: Number, value: 10 }
};
Для сложных типов лучше использовать фабричные функции, чтобы избежать разделяемых ссылок между экземплярами.
static properties = {
data: { value: () => ({ clicks: 0 }) }
};
Slim.js предоставляет хуки жизненного цикла. Наиболее важный в
контексте свойств — onPropertyChanged. Он принимает имя
свойства, новое и старое значения.
onPropertyChanged(prop, newValue, oldValue) {
if (prop === 'count' && newValue > oldValue) {
console.log('Счётчик увеличился');
}
}
Использование этого механизма освобождает от необходимости вручную подписываться на изменения.
Свойства могут передаваться через HTML-разметку:
<x-counter count="5" label="Times"></x-counter>
Slim.js выполнит преобразование типов в соответствии с объявлением. Если свойство не объявлено, оно воспринимается как атрибут без реактивности.
При работе со сложными данными Slim.js сохраняет реактивность лишь на уровне ссылки. Изменение вложенных структур без смены ссылки не вызовет перерисовку.
this.data.clicks++;
// шаблон не обновится
this.data = { ...this.data, clicks: this.data.clicks + 1 };
// шаблон обновится
Такой подход важен при проектировании сложного состояния и оптимизации рендеринга.
Slim.js связывает свойства с шаблоном через ${} в HTML.
Связи работают однонаправленно: представление отражает состояние.
<span>${count}</span>
При обновлении count значение обновится автоматически,
исключая ручные манипуляции с DOM.
Свойства часто используются как конечное состояние событийного слоя. Например, событие клика увеличивает счётчик, а отображение обновляется на основе свойства.
<button on:click="count++">+</button>
<span>${count}</span>
Slim.js интерпретирует выражение и обновляет значение свойства.
Свойства компонента инкапсулируют состояние, позволяя компонентам быть самодостаточными и повторно используемыми. Отсутствие глобальных зависимостей облегчает интеграцию библиотекой в различные архитектуры, включая MVC, MVVM и реактивные паттерны.
Механизм свойств в Slim.js формирует основу компонентной модели: он обеспечивает инициализацию, реактивность, взаимодействие с DOM и жизненным циклом. Определение свойств напрямую влияет на предсказуемость состояния и удобство использования компонентов, а грамотное объявление улучшает читаемость и расширяемость кода.