Kernkonzepte
StimulusReflex ermöglicht reaktive Echtzeit-Benutzeroberflächen in Rails-Anwendungen mittels WebSockets (ActionCable) und CableReady.
Grundlegender 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-Modi
Page Morph (Standard)
Rendert die gesamte Seite über die Controller-Aktion neu und überträgt Unterschiede in das 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
Führt serverseitige Logik aus, ohne das Client-DOM zu aktualisieren.
class ExampleReflex < ApplicationReflex
def background_task
LongRunningJob.perform_later
morph :nothing
end
end
Lebenszyklus-Methoden
Serverseitige Callbacks
class ExampleReflex < ApplicationReflex
before_reflex :authenticate
around_reflex :measure_time
after_reflex :log_activity
end
Clientseitige generische Callbacks
beforeReflex(element, reflex, noop, reflexId): Vor dem Senden des WebSocket-RequestsreflexSuccess(element, reflex, noop, reflexId): Nach Ausführung des Reflex und DOM-AktualisierungreflexError(element, reflex, error, reflexId): Wenn der Server einen unbehandelten Fehler auslöstreflexHalted(element, reflex, noop, reflexId): Wenn der Reflex mitthrow :abortabgebrochen wirdafterReflex(element, reflex, noop, reflexId): Wird bei Erfolg und Misserfolg ausgeführtfinalizeReflex(element, reflex, noop, reflexId): Abschließender Bereinigungshook
DOM-Events
stimulus-reflex:beforestimulus-reflex:successstimulus-reflex:errorstimulus-reflex:haltedstimulus-reflex:afterstimulus-reflex:connectedstimulus-reflex:disconnectedstimulus-reflex:ready
Praktische Muster
Formularverarbeitung
Reflexe, die innerhalb oder auf Formularelementen ausgelöst werden, serialisieren Eingaben automatisch in params.
Promise-Verkettung
this.stimulate('Comments#create')
.then(() => this.showSuccess())
.catch((err) => this.handleError(err))
Permanente Elemente
Markieren Sie Elemente mit data-reflex-permanent, damit sie von Full-Page-Morphs unberührt bleiben.
<div data-reflex-permanent>
<video id="player" src="video.mp4" controls></video>
</div>