Stimulus организует взаимодействие с DOM через контроллеры, которые
автоматически привязываются к элементам с атрибутами
data-controller. Контроллеры создаются как классы
JavaScript, наследуемые от Stimulus.Controller. При
загрузке страницы или динамическом добавлении элементов фреймворк
автоматически инициализирует контроллер, связывая его с элементами
DOM.
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
connect() {
console.log("Контроллер подключен")
}
}
Атрибут data-controller="example" на элементе связывает
его с классом контроллера ExampleController. Методы
жизненного цикла вызываются автоматически в определенные моменты
существования контроллера.
Stimulus предоставляет несколько ключевых методов жизненного цикла:
connect()Метод вызывается один раз при привязке контроллера к DOM-элементу. Используется для инициализации состояния, привязки событий и настройки начального состояния интерфейса.
Особенности:
addEventListener.Пример:
connect() {
this.element.textContent = "Контроллер активен"
}
disconnect()Метод вызывается при удалении элемента из DOM или отключении контроллера. Позволяет очищать ресурсы, удалять подписки и события, чтобы избежать утечек памяти.
Пример:
disconnect() {
console.log("Контроллер отключен")
}
Особенности:
connect,
желательно удалять здесь.initialize()Метод вызывается перед connect(), сразу
после создания экземпляра контроллера, но до его привязки к DOM.
Используется для подготовки начальных данных и внутреннего состояния
контроллера.
Пример:
initialize() {
this.counter = 0
}
Особенности:
this.element, так как
он еще не подключен.targetsStimulus позволяет объявлять цели
(targets) в контроллере через атрибут
data-target. Методы жизненного цикла часто используют их
для работы с определенными элементами внутри контроллера.
<div data-controller="counter">
<span data-counter-target="output">0</span>
<button data-action="click->counter#increment">Увеличить</button>
</div>
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["output"]
connect() {
this.outputTarget.textContent = "0"
}
increment() {
this.outputTarget.textContent = parseInt(this.outputTarget.textContent) + 1
}
}
Использование targets делает код чистым, легко
поддерживаемым и избавляет от необходимости вручную искать элементы
через querySelector.
actionsStimulus связывает события с методами контроллера через атрибут
data-action. Жизненный цикл контроллера гарантирует, что
методы доступны в момент срабатывания событий после
connect().
<button data-controller="alert" data-action="click->alert#show">Нажми меня</button>
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
show() {
alert("Событие обработано!")
}
}
Особенности:
show вызывается только тогда, когда контроллер
подключен.Stimulus автоматически отслеживает добавление элементов в DOM. Методы
initialize и connect вызываются для каждого
нового элемента, соответствующего data-controller. Это
позволяет динамически подгружать компоненты без переписывания
логики.
Пример динамического добавления:
const newElement = document.createElement("div")
newElement.setAttribute("data-controller", "counter")
document.body.appendChild(newElement)
При добавлении newElement Stimulus создаст новый
экземпляр CounterController и вызовет
initialize() и connect().
initialize для внутренних свойств, connect для
работы с DOM.disconnect.Методы жизненного цикла являются фундаментом для построения стабильных, динамичных и легко расширяемых компонентов в Stimulus. Их правильное использование обеспечивает надежную работу интерфейсов без лишней сложности и утечек ресурсов.