Stimulus — это минималистичный JavaScript-фреймворк, ориентированный
на управление поведением HTML-элементов через контроллеры. Ключевой
особенностью является жизненный цикл контроллера, в рамках которого
выполняются методы initialize, connect и
disconnect. Понимание этих методов позволяет точно
управлять состоянием приложения и оптимизировать работу с DOM.
initializeМетод initialize вызывается один раз при
создании экземпляра контроллера, ещё до того, как контроллер
будет подключён к DOM. На этом этапе можно выполнять подготовительные
операции, такие как:
Пример использования:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
initialize() {
this.counter = 0
console.log("Контроллер создан")
}
}
Особенности initialize:
connectМетод connect срабатывает каждый раз, когда контроллер
подключается к DOM. Это происходит сразу после вставки
элемента на страницу или при повторном подключении, если элемент был
временно удалён и добавлен снова. Основные задачи:
Пример использования:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
connect() {
console.log("Контроллер подключён")
this.element.textContent = `Счётчик: ${this.counter}`
this.element.addEventListener("click", this.increment.bind(this))
}
increment() {
this.counter++
this.element.textContent = `Счётчик: ${this.counter}`
}
}
Ключевые моменты метода connect:
this.element и
this.targets.disconnectМетод disconnect вызывается, когда контроллер
отключается от DOM, например, при удалении элемента или
при динамической перестройке интерфейса. Основные цели:
Пример использования:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
connect() {
this.interval = setInterval(() => console.log("Работа контроллера"), 1000)
}
disconnect() {
clearInterval(this.interval)
console.log("Контроллер отключён")
}
}
Особенности disconnect:
Последовательность вызова методов при жизненном цикле контроллера выглядит следующим образом:
initialize.connect.disconnect.connect.Важно понимать, что initialize выполняется один
раз, а connect и disconnect могут
вызываться многократно, что позволяет динамически управлять поведением
элементов.
initialize.connect.disconnect, чтобы избежать утечек памяти.import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
initialize() {
this.counter = 0
}
connect() {
this.updateDisplay()
this.element.addEventListener("click", this.increment.bind(this))
console.log("Контроллер активен")
}
disconnect() {
this.element.removeEventListener("click", this.increment.bind(this))
console.log("Контроллер деактивирован")
}
increment() {
this.counter++
this.updateDisplay()
}
updateDisplay() {
this.element.textContent = `Счётчик: ${this.counter}`
}
}
В этом примере:
initialize устанавливает начальное состояние.connect добавляет обработчик событий и обновляет
интерфейс.disconnect удаляет обработчик событий и освобождает
ресурсы.Эта структура обеспечивает безопасное и предсказуемое поведение контроллера независимо от динамических изменений DOM.