Stimulus — это легковесный JavaScript-фреймворк, который ориентирован
на улучшение HTML с помощью небольших контроллеров. Одним из ключевых
элементов работы с контроллерами являются таргеты.
Таргеты позволяют легко получать доступ к элементам DOM, которые важны
для логики конкретного контроллера, без необходимости писать громоздкие
селекторы или вручную искать элементы через
querySelector.
Таргеты объявляются в контроллере через статическое свойство
targets, которое является массивом строк. Каждая строка —
это имя таргета:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["input", "output"]
}
В этом примере контроллер имеет два таргета: input и
output. Имена таргетов должны быть уникальными в пределах
одного контроллера.
Для привязки таргета к элементу используется атрибут
data-<имя-контроллера>-target. Если контроллер
называется example, таргеты будут указываться так:
<div data-controller="example">
<input data-example-target="input" type="text">
<span data-example-target="output"></span>
</div>
Каждый элемент с соответствующим атрибутом автоматически становится частью коллекции таргетов контроллера.
После объявления таргетов, к ним можно обращаться через автоматически создаваемые свойства контроллера:
this.<имя>Target:connect() {
this.inputTarget.focus()
}
this.<имя>Targets:static targets = ["item"]
addClassToItems() {
this.itemTargets.forEach(el => el.classList.add("highlight"))
}
Таким образом, таргеты удобно использовать как одиночные элементы, так и коллекции.
Stimulus предоставляет методы для проверки, присутствует ли элемент на странице:
has<Имя>Target — возвращает true,
если одиночный таргет найден.has<Имя>Targets — возвращает true,
если массив таргетов не пустой.if (this.hasOutputTarget) {
this.outputTarget.textContent = "Таргет найден"
}
Таргеты можно применять для динамического управления интерфейсом:
toggleVisibility() {
this.outputTarget.classList.toggle("hidden")
}
updateText(value) {
this.outputTarget.textContent = value
}
clearInput() {
this.inputTarget.value = ""
}
static targets = ["userName"]
<input data-example-target="user-name">
Stimulus автоматически конвертирует user-name в
userName для обращения из JavaScript.
Если несколько контроллеров используют один и тот же элемент,
необходимо соблюдать уникальность атрибутов data-*-target.
Таргеты работают только внутри своего контроллера, поэтому пересечение
логики контроллеров не приводит к конфликтам.
querySelector.this.<name>Target и
this.<name>Targets).has<Имя>Target(s) позволяют безопасно
проверять наличие элементов.Использование таргетов упрощает архитектуру контроллеров и делает код более декларативным и удобочитаемым.