Główne pojęcia
StimulusReflex umożliwia tworzenie reaktywnych interfejsów w czasie rzeczywistym w Rails przy użyciu WebSockets (ActionCable) i CableReady.
Podstawowy 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
Tryby Morph (Morph Modes)
Page Morph (Domyślny)
Renderuje całą stronę za pośrednictwem kontrolera i nakłada różnice na drzewo 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
Wykonuje logikę serwerową bez aktualizacji drzewa DOM klienta.
class ExampleReflex < ApplicationReflex
def background_task
LongRunningJob.perform_later
morph :nothing
end
end
Metody cyklu życia
Callbacki po stronie serwera
class ExampleReflex < ApplicationReflex
before_reflex :authenticate
around_reflex :measure_time
after_reflex :log_activity
end
Ogólne callbacki po stronie klienta
beforeReflex(element, reflex, noop, reflexId): Przed wysłaniem żądania WebSocketreflexSuccess(element, reflex, noop, reflexId): Po wykonaniu reflexu i aktualizacji DOMreflexError(element, reflex, error, reflexId): Gdy serwer zgłosi nieobsługiwany błądreflexHalted(element, reflex, noop, reflexId): Gdy reflex zostanie przerwany przezthrow :abortafterReflex(element, reflex, noop, reflexId): Wywoływany zarówno przy sukcesie, jak i błędziefinalizeReflex(element, reflex, noop, reflexId): Końcowy hook czyszczący
Zdarzenia DOM
stimulus-reflex:beforestimulus-reflex:successstimulus-reflex:errorstimulus-reflex:haltedstimulus-reflex:afterstimulus-reflex:connectedstimulus-reflex:disconnectedstimulus-reflex:ready
Wzorce praktyczne
Obsługa formularzy
Reflexy wyzwalane wewnątrz formularza automatycznie serializują dane wejściowe do params.
Łańcuchy Promises
this.stimulate('Comments#create')
.then(() => this.showSuccess())
.catch((err) => this.handleError(err))
Elementy trwałe (Permanent Elements)
Oznacz elementy atrybutem data-reflex-permanent, aby pełne morphs strony ich nie modyfikowały.
<div data-reflex-permanent>
<video id="player" src="video.mp4" controls></video>
</div>