Краткий справочник

Шпаргалка по StimulusReflex

Краткое справочное руководство по StimulusReflex в Ruby on Rails: действия reflex, режимы morph, колбэки жизненного цикла и клиентские события.

· Опубликовано

Основные концепции

StimulusReflex позволяет создавать реактивные интерфейсы в реальном времени в Rails с помощью WebSockets (ActionCable) и CableReady.

Базовый Reflex

<!-- view.html.erb -->
<button data-reflex="click->Counter#increment">Increment</button>
# app/reflexes/counter_reflex.rb
class CounterReflex < ApplicationReflex
  def increment
    @count = element.dataset[:count].to_i + 1
  end
end

Режимы Morph

Page Morph (По умолчанию)

Повторно рендерит всю страницу через действие контроллера и плавно встраивает различия в DOM.

Selector Morph

# app/reflexes/example_reflex.rb
class ExampleReflex < ApplicationReflex
  def update_metric
    morph "#metric-display", render(partial: "metrics/metric", locals: { value: 42 })
  end
end

Nothing Morph

Выполняет серверную логику без обновления клиентского DOM.

class ExampleReflex < ApplicationReflex
  def background_task
    LongRunningJob.perform_later
    morph :nothing
  end
end

Методы жизненного цикла

Серверные колбэки

class ExampleReflex < ApplicationReflex
  before_reflex :authenticate
  around_reflex :measure_time
  after_reflex :log_activity
end

Клиентские общие колбэки

  • beforeReflex(element, reflex, noop, reflexId): До отправки запроса по WebSocket
  • reflexSuccess(element, reflex, noop, reflexId): После успешного выполнения и обновления DOM
  • reflexError(element, reflex, error, reflexId): При возникновении необработанной ошибки на сервере
  • reflexHalted(element, reflex, noop, reflexId): Если reflex был остановлен через throw :abort
  • afterReflex(element, reflex, noop, reflexId): Выполняется как при успехе, так и при ошибке
  • finalizeReflex(element, reflex, noop, reflexId): Финальный хук очистки

События DOM

  • stimulus-reflex:before
  • stimulus-reflex:success
  • stimulus-reflex:error
  • stimulus-reflex:halted
  • stimulus-reflex:after
  • stimulus-reflex:connected
  • stimulus-reflex:disconnected
  • stimulus-reflex:ready

Практические шаблоны

Работа с формами

Рефлексы, вызванные элементами формы, автоматически сериализуют поля и передают их в params.

Цепочки Promise

this.stimulate('Comments#create')
  .then(() => this.showSuccess())
  .catch((err) => this.handleError(err))

Постоянные элементы (Permanent Elements)

Помечайте элементы атрибутом data-reflex-permanent, чтобы полное обновление страницы их не затрагивало.

<div data-reflex-permanent>
  <video id="player" src="video.mp4" controls></video>
</div>

Полезные ссылки

Связанные темы