Семантическая разметка

Stimulus — это фреймворк JavaScript, ориентированный на повышение интерактивности веб-страниц без создания сложной клиентской архитектуры. Его основа строится на принципе «HTML управляет поведением», что делает семантическую разметку ключевым элементом разработки.

Контроллеры и привязка к DOM

В Stimulus взаимодействие с элементами страницы осуществляется через контроллеры, которые привязываются к DOM с помощью атрибута data-controller. Например:

<div data-controller="example">
  <button data-action="click->example#greet">Сказать привет</button>
</div>
  • data-controller="example" указывает на контроллер ExampleController.
  • data-action="click->example#greet" связывает событие click с методом greet контроллера.

Использование таких атрибутов повышает семантическую выразительность HTML: элементы несут не только визуальную функцию, но и смысловую нагрузку, указывая на своё поведение.

Селекторы значимых элементов (Targets)

Stimulus позволяет определять targets — элементы, на которые контроллер может ссылаться напрямую. Это делается через атрибут data-<controller>-target.

<div data-controller="form">
  <input data-form-target="name" type="text">
  <button data-action="click->form#submit">Отправить</button>
</div>

В контроллере:

import { Controller } from "@hotwired/stimulus";

export default class extends Controller {
  static targets = ["name"];

  submit() {
    console.log(this.nameTarget.value);
  }
}

Преимущества targets:

  • Семантическая ясность: атрибуты отражают роль элемента.
  • Упрощение доступа к DOM без использования querySelector.
  • Повышение читаемости и поддержки кода.

Декларативные действия (Actions)

Stimulus активно использует data-action для привязки событий. Формат:

data-action="событие->контроллер#метод"

Можно комбинировать несколько действий:

<button data-action="mouseover->tooltip#show mouseout->tooltip#hide">
  Наведи мышь
</button>

Это позволяет отделять логику от представления, сохраняя семантику разметки и облегчая поддержку интерактивных элементов.

Значения (Values) и семантические данные

С помощью data-<controller>-<name>-value можно хранить данные в HTML, доступные в контроллере. Пример:

<div data-controller="counter" data-counter-step-value="5">
  <button data-action="click->counter#increment">Увеличить</button>
</div>

В контроллере:

export default class extends Controller {
  static values = { step: Number }
  count = 0

  increment() {
    this.count += this.stepValue
    console.log(this.count)
  }
}

Преимущества использования values:

  • Явное указание данных в HTML без инлайнового JavaScript.
  • Семантическая прозрачность: атрибут отражает смысл параметра.
  • Легкость конфигурирования контроллеров на уровне разметки.

Структурирование сложных компонентов

Для крупных интерфейсов Stimulus рекомендует использовать связку нескольких контроллеров. Каждый контроллер отвечает за определённую часть DOM, а взаимодействие реализуется через события или shared targets. Например, модальное окно может состоять из:

  • modal — управляет открытием и закрытием.
  • modal-content — отвечает за содержимое и динамические элементы.

Такое разделение поддерживает чистую и семантически насыщенную разметку, где каждый элемент несёт конкретную роль.

Динамическое добавление элементов

Stimulus автоматически подключает контроллеры к новым элементам, если они добавляются через DOM API или Turbo. Это позволяет поддерживать динамическую семантическую разметку без переписывания логики.

Пример с Turbo Frames:

<turbo-frame id="comments" data-controller="comments">
  <!-- новые комментарии будут автоматически управляться контроллером -->
</turbo-frame>

Итоговые принципы семантики в Stimulus

  1. Привязка поведения через атрибуты — HTML сам показывает, какие элементы интерактивны.
  2. Использование targets и values — ясное назначение элементов и данных, повышающее читаемость.
  3. Декларативные actions — упрощают связывание событий и методов без инлайнового JS.
  4. Разделение контроллеров — каждая часть интерфейса имеет отдельный, семантически обоснованный контроллер.
  5. Совместимость с динамическими элементами — семантика сохраняется при изменении DOM.

Эти подходы делают Stimulus мощным инструментом для создания интерактивных, поддерживаемых и семантически насыщенных веб-приложений.