Concetti Fondamentali
StimulusReflex consente interfacce utente reattive in tempo reale nelle applicazioni Rails tramite WebSockets (ActionCable) e CableReady.
Reflex di base
<!-- 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
Modalità Morph
Page Morph (Predefinito)
Effettua nuovamente il rendering dell'intera pagina e applica le differenze al 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
Esegue logica lato server senza aggiornare il DOM del client.
class ExampleReflex < ApplicationReflex
def background_task
LongRunningJob.perform_later
morph :nothing
end
end
Metodi del Ciclo di Vita
Callback lato server
class ExampleReflex < ApplicationReflex
before_reflex :authenticate
around_reflex :measure_time
after_reflex :log_activity
end
Callback generici lato client
beforeReflex(element, reflex, noop, reflexId): Prima dell'invio della richiesta WebSocketreflexSuccess(element, reflex, noop, reflexId): Dopo l'esecuzione del reflex e aggiornamento DOMreflexError(element, reflex, error, reflexId): Quando il server genera un errore non gestitoreflexHalted(element, reflex, noop, reflexId): Quando il reflex viene interrotto conthrow :abortafterReflex(element, reflex, noop, reflexId): Eseguito sia in caso di successo che di fallimentofinalizeReflex(element, reflex, noop, reflexId): Hook finale di pulizia
Eventi DOM
stimulus-reflex:beforestimulus-reflex:successstimulus-reflex:errorstimulus-reflex:haltedstimulus-reflex:afterstimulus-reflex:connectedstimulus-reflex:disconnectedstimulus-reflex:ready
Pattern Pratici
Gestione dei form
I reflex attivati su elementi del form serializzano automaticamente i valori nei params.
Concatenamento di Promise
this.stimulate('Comments#create')
.then(() => this.showSuccess())
.catch((err) => this.handleError(err))
Elementi Permanenti
Contrassegna gli elementi con data-reflex-permanent per preservarli durante i morph completi.
<div data-reflex-permanent>
<video id="player" src="video.mp4" controls></video>
</div>