В фреймворке Stimulus жизненный цикл контроллера организован так,
чтобы разработчик имел строгий контроль над инициализацией и поведением
компонентов. Контроллер Stimulus — это класс, который расширяет
Controller и привязывается к элементу DOM через атрибут
data-controller. Жизненный цикл контроллера включает
несколько ключевых методов: initialize,
connect, disconnect и дополнительные методы
для наблюдения за изменениями.
initializeМетод initialize вызывается один раз в момент
создания экземпляра контроллера, до того как элемент будет
подключен к DOM. На этом этапе доступна ссылка на элемент
this.element, но DOM-дерево может быть ещё не полностью
готово для манипуляций. Основные задачи метода:
Пример:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
initialize() {
this.counter = 0
console.log("Контроллер создан, DOM может быть ещё не готов")
}
}
connectМетод connect вызывается каждый раз, когда
элемент появляется в DOM. Это основной момент для
взаимодействия с интерфейсом, подписок на события и активации сторонних
библиотек. Если элемент был временно удалён из DOM и возвращён,
connect будет вызван повторно.
Основные действия в connect:
Пример:
connect() {
this.element.addEventListener("click", this.increment.bind(this))
console.log("Элемент подключён к DOM")
}
increment() {
this.counter++
console.log(`Счётчик: ${this.counter}`)
}
disconnectМетод disconnect вызывается при удалении
элемента из DOM. Он предназначен для очистки ресурсов и
предотвращения утечек памяти. Любые подписки на события, таймеры или
сторонние объекты следует освобождать именно здесь.
Пример:
disconnect() {
this.element.removeEventListener("click", this.increment)
console.log("Элемент удалён из DOM, подписки очищены")
}
refresh и
reconnectStimulus также поддерживает динамическое управление элементами. Если элемент перемещается внутри DOM, контроллер может быть автоматически отключен и подключён заново, что позволяет обновить привязки.
reconnect() — вручную можно вызвать повторное
подключение контроллера к элементу.refresh() — обновляет значения и связи с элементами,
особенно полезно при динамических изменениях DOM через сторонние
библиотеки.initialize.connect.disconnect.connect снова.Важно учитывать, что initialize вызывается
только один раз за жизненный цикл экземпляра, а
connect и disconnect могут вызываться
многократно при динамических изменениях DOM.
initialize.connect, так как
на этом этапе элемент гарантированно присутствует в документе.disconnect для предотвращения утечек памяти.connect может быть вызван повторно, а
внутренние состояния необходимо корректно синхронизировать.import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
initialize() {
this.counter = 0
console.log("Контроллер инициализирован")
}
connect() {
this.element.addEventListener("click", this.increment.bind(this))
console.log("Контроллер подключён")
}
disconnect() {
this.element.removeEventListener("click", this.increment)
console.log("Контроллер отключён")
}
increment() {
this.counter++
this.element.textContent = `Счётчик: ${this.counter}`
}
}
Такой подход обеспечивает чёткий контроль над жизненным циклом, позволяет безопасно работать с динамическим DOM и гарантирует предсказуемое поведение компонентов.