Stimulus строится вокруг концепции контроллеров, которые связывают поведение JavaScript с HTML через атрибуты данных. Контроллеры управляют состоянием элементов, обеспечивая интерактивность без необходимости полного JavaScript-фреймворка. Управление состоянием является ключевым аспектом для построения динамических интерфейсов.
Каждый контроллер — это класс, расширяющий Controller из
Stimulus. Контроллеры могут хранить состояние через публичные
свойства класса, что позволяет отслеживать текущее состояние
элементов:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["toggleButton", "content"];
visible = false; // начальное состояние
toggle() {
this.visible = !this.visible;
this.updateDisplay();
}
updateDisplay() {
this.contentTarget.style.display = this.visible ? "block" : "none";
}
}
Ключевые моменты:
Stimulus предоставляет механизм Values, который позволяет связывать данные с атрибутами HTML и автоматически синхронизировать их со свойствами контроллера. Это упрощает управление состоянием и делает код более декларативным.
Values объявляются статически через объект
static values:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static values = {
count: Number,
label: String,
active: Boolean
};
}
countValue — числовое значение, привязанное к атрибуту
data-controller-count-value.labelValue — строковое значение, привязанное к
data-controller-label-value.activeValue — логическое значение, привязанное к
data-controller-active-value.Доступ к значению осуществляется через автоматически создаваемые
свойства с суффиксом Value:
increment() {
this.countValue++;
console.log(this.countValue);
}
toggleActive() {
this.activeValue = !this.activeValue;
}
Values связываются с атрибутами данных HTML автоматически:
<div data-controller="counter"
data-counter-count-value="5"
data-counter-label-value="Прогресс"
data-counter-active-value="true">
</div>
Изменение this.countValue в контроллере автоматически
обновляет соответствующее значение в DOM при необходимости, а также
можно реагировать на изменения с помощью специальных методов.
Для каждого Value можно определить метод, который вызывается при изменении значения:
countValueChanged(oldValue, newValue) {
console.log(`Счетчик изменился с ${oldValue} на ${newValue}`);
this.updateDisplay();
}
Особенности:
<имяValue>Changed.Stimulus поддерживает несколько типов данных для Values:
data-<controller>-<name>-value="text").data-<controller>-<name>-value="123").data-<controller>-<name>-value="true"/false).data-<controller>-<name>-value='{"key": "value"}').data-<controller>-<name>-value='[1,2,3]').Использование правильного типа обеспечивает автоматическую конвертацию значений и упрощает работу с ними в JavaScript.
Values доступны сразу после инициализации контроллера, что позволяет
использовать их в методах connect и
initialize:
connect() {
if (this.activeValue) {
this.showContent();
}
}
initialize() {
console.log(`Начальное количество: ${this.countValue}`);
}
Различие между initialize и connect:
initialize вызывается до того, как контроллер связан с
DOM.connect вызывается после связывания с DOM, что
позволяет безопасно изменять видимость элементов и доступ к
target-элементам.Values удобно использовать совместно с Targets для управления состоянием визуальных компонентов:
static targets = ["panel"];
static values = { visible: Boolean };
toggle() {
this.visibleValue = !this.visibleValue;
this.panelTarget.style.display = this.visibleValue ? "block" : "none";
}
Преимущества:
<Value>Changed.<Value>Changed обеспечивают реактивное
поведение.