Основные концепции
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): До отправки запроса по WebSocketreflexSuccess(element, reflex, noop, reflexId): После успешного выполнения и обновления DOMreflexError(element, reflex, error, reflexId): При возникновении необработанной ошибки на сервереreflexHalted(element, reflex, noop, reflexId): Если reflex был остановлен черезthrow :abortafterReflex(element, reflex, noop, reflexId): Выполняется как при успехе, так и при ошибкеfinalizeReflex(element, reflex, noop, reflexId): Финальный хук очистки
События DOM
stimulus-reflex:beforestimulus-reflex:successstimulus-reflex:errorstimulus-reflex:haltedstimulus-reflex:afterstimulus-reflex:connectedstimulus-reflex:disconnectedstimulus-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>