Stimulus строится вокруг концепции контроллеров,
которые управляют поведением элементов на странице. Контроллеры
связываются с DOM через data-controller и могут содержать
состояние, которое важно отслеживать для правильной
работы приложения. Инспектирование состояния контроллеров позволяет
контролировать их поведение, отлаживать взаимодействие и выявлять ошибки
на ранних этапах.
Состояние контроллера в Stimulus формируется следующими компонентами:
Публичные свойства Любое свойство класса контроллера может выступать состоянием. Например:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
count = 0
active = false
}
Здесь count и active являются внутренним
состоянием, которое можно изменять через методы контроллера.
Value properties Stimulus поддерживает value properties, позволяющие объявлять типизированные свойства с автоматическим связыванием с атрибутами DOM:
static values = { count: Number, active: Boolean }
Эти свойства автоматически синхронизируются с атрибутами:
<div data-controller="counter" data-counter-count-value="5"></div>
Любое изменение значения через this.countValue
отражается на DOM и наоборот.
Targets Состояние контроллера может зависеть от targets — элементов, к которым контроллер привязан:
static targets = ["output"]
connect() {
this.outputTarget.textContent = `Начальное значение: ${this.countValue}`
}
Targets упрощают доступ к DOM-узлам и обеспечивают контроль их состояния через контроллер.
Stimulus предоставляет несколько способов для наблюдения и инспекции состояния контроллеров:
Доступ через консоль браузера Каждый контроллер доступен через DOM-элемент:
const element = document.querySelector('[data-controller="counter"]')
const controller = Stimulus.Application.getControllerForElementAndIdentifier(element, "counter")
console.log(controller.countValue)
Это позволяет проверять текущие значения, состояние targets и выполнять динамическое тестирование методов.
Отслеживание изменений значений (Value Observer)
Stimulus автоматически вызывает методы XXXValueChanged при
изменении value properties:
countValueChanged(newValue, oldValue) {
console.log(`count изменился с ${oldValue} на ${newValue}`)
}
Такой подход упрощает мониторинг состояния без ручного добавления слушателей.
Custom events для логирования Контроллер может генерировать события при изменении состояния:
this.element.dispatchEvent(new CustomEvent("counter:changed", {
detail: { count: this.countValue }
}))
Внешние компоненты или инспектор DOM могут подписываться на эти события для наблюдения состояния.
Инспекция состояния контроллера необходима в нескольких случаях:
Например, для контроллера счетчика можно создать утилиту для консольной инспекции:
function inspectController(identifier) {
document.querySelectorAll(`[data-controller="${identifier}"]`).forEach(el => {
const ctrl = Stimulus.Application.getControllerForElementAndIdentifier(el, identifier)
console.log(ctrl)
})
}
inspectController("counter")
Это позволяет выводить полное состояние всех экземпляров контроллера на странице.
querySelector внутри методов
контроллера.Современные браузеры позволяют комбинировать инспекцию состояния через:
Stimulus не требует сложной инфраструктуры для инспекции состояния, но строгая организация value properties, targets и событий позволяет построить прозрачный и управляемый интерфейс, где поведение контроллеров полностью предсказуемо и легко тестируется.