Stimulus — это JavaScript-фреймворк, ориентированный на минимальное вмешательство в существующую HTML-разметку. Основной строительный блок в Stimulus — контроллер, который связывает DOM-элементы с поведением.
Контроллер в Stimulus представляет собой класс, унаследованный от
Stimulus.Controller. Его основная задача — инкапсулировать
логику взаимодействия с DOM-элементами, управлять состоянием и
реагировать на события.
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["output"];
connect() {
this.outputTarget.textContent = "Контроллер подключен!";
}
greet() {
console.log("Привет от Stimulus-контроллера!");
}
}
Ключевые моменты определения:
static targets — массив имен целей (targets), через
которые контроллер получает доступ к элементам DOM.connect() вызывается при подключении контроллера
к DOM-элементу.Контроллер Stimulus проходит несколько стадий, которые формируют его жизненный цикл:
Инициализация
data-controller на элементе DOM.Подключение (connect)
connect() вызывается сразу после вставки элемента
в DOM.Отключение (disconnect)
disconnect() вызывается при удалении элемента из
DOM.Обновление (initialize)
initialize() вызывается при создании экземпляра
контроллера до подключения к DOM.Stimulus использует два ключевых механизма для взаимодействия с DOM: targets и actions.
Targets
data-<controller>-target="имя"
в HTML.<div data-controller="hello">
<span data-hello-target="output"></span>
</div>
В контроллере this.outputTarget будет ссылкой на
span.
Actions
data-action="событие->контроллер#метод".<button data-action="click->hello#greet">Сказать привет</button>Stimulus поддерживает value-объекты, которые позволяют хранить реактивные данные прямо в DOM:
static values = { count: Number }
connect() {
console.log(this.countValue)
}
increment() {
this.countValue++
}
HTML:
<div data-controller="counter" data-counter-count-value="0">
<button data-action="click->counter#increment">+</button>
</div>
this.countValue = ... обновляет
внутреннее состояние контроллера, но не изменяет DOM напрямую (для этого
нужно использовать targets).export default class ExtendedController extends BaseController {
connect() {
super.connect();
console.log("Дополнительная логика при подключении");
}
}
disconnect() для очистки слушателей
и таймеров.initialize() должна быть
минимальной, чтобы не блокировать DOM.querySelector, чтобы сохранить декларативность и
поддерживаемость кода.Stimulus предлагает простой, но мощный подход к управлению поведением элементов DOM, где жизненный цикл контроллера обеспечивает чистое управление ресурсами и упрощает масштабирование приложений.