Ruby on Rails
React.js mithilfe von Hyperloop in Rails integrieren
Suche…
Einführung
In diesem Thema wird die Integration von React.js mit Rails mithilfe des Hyperloop- Gems beschrieben
Andere Ansätze, die hier nicht behandelt werden, sind die reakts-Schienen oder die reakt_on_rails-Edelsteine.
Bemerkungen
Komponentenklassen generieren einfach die entsprechenden Javascript-Komponentenklassen.
Sie können auch direkt von Ihren Ruby-Komponentenklassen auf Javascript-Komponenten und -Bibliotheken zugreifen.
Hyperloop "prerender" die View-Server-Seite, sodass Ihre ursprüngliche Ansicht genau wie ERB- oder HAML-Vorlagen geladen wird. Nach dem Laden auf dem Client übernimmt rea und wird das DOM inkrementell aktualisieren, wenn sich der Status aufgrund von Eingaben des Benutzers, HTTP-Anforderungen oder eingehenden Web-Socket-Daten ändert.
Neben den Komponenten verfügt Hyperloop über Stores zum Verwalten des gemeinsam genutzten Zustands, Operationen zum Einkapseln von isomorpher Geschäftslogik und Modelle, die direkten Zugriff auf Ihre ActiveRecord-Modelle auf dem Client mit der Standard-AR-Syntax ermöglichen.
Mehr Infos hier: http://ruby-hyperloop.io/
Hinzufügen einer einfachen Reaktionskomponente (in Ruby geschrieben) zu Ihrer Rails-App
- Füge den Hyperloop-Edelstein zu deinen Rails (4.0 - 5.1) hinzu
-
bundle install
- Fügen Sie das Hyperloop-Manifest der Datei "application.js" hinzu:
// app/assets/javascripts/application.js ... //= hyperloop-loader
- Erstellen Sie Ihre Reaktionskomponenten und platzieren Sie sie im
hyperloop/components
# app/hyperloop/components/hello_world.rb class HelloWorld < Hyperloop::Component after_mount do every(1.second) { mutate.current_time(Time.now) } end render do "Hello World! The time is now: #{state.current_time}" end end
- Komponenten wirken wie Ansichten. Sie werden mithilfe der
render_component
Methode in einem Controller "angehängt":# somewhere in a controller: ... def hello_world render_component # renders HelloWorld based on method name end
Komponentenparameter deklarieren (Requisiten)
class Hello < Hyperloop::Component # params (= react props) are declared using the param macro param :guest render do "Hello there #{params.guest}" end end # to "mount" Hello with guest = "Matz" say Hello(guest: 'Matz') # params can be given a default value: param guest: 'friend' # or param :guest, default: 'friend'
HTML-Tags
# HTML tags are built in and are UPCASE class HTMLExample < Hyperloop::Component render do DIV do SPAN { "Hello There" } SPAN { "Welcome to the Machine!" } end end end
Event-Handler
# Event handlers are attached using the 'on' method class ClickMe < Hyperloop::Component render do DIV do SPAN { "Hello There" } A { "Click Me" }.on(:click) { alert('you did it!' } end end end
Zustände
# States are read using the 'state' method, and updated using 'mutate' # when states change they cause re-render of all dependent dom elements class StateExample < Hyperloop::Component state count: 0 # by default states are initialized to nil render do DIV do SPAN { "Hello There" } A { "Click Me" }.on(:click) { mutate.count(state.count + 1) } DIV do "You have clicked me #{state.count} #{'time'.pluralize(state.count)}" end unless state.count == 0 end end end
Beachten Sie, dass Zustände mithilfe von Hyperloop :: Stores von Komponenten gemeinsam genutzt werden können
Rückrufe
# all react callbacks are supported using active-record-like syntax class SomeCallBacks < Hyperloop::Component before_mount do # initialize stuff - replaces normal class initialize method end after_mount do # any access to actual generated dom node, or window behaviors goes here end before_unmount do # any cleanups (i.e. cancel intervals etc) end # you can also specify a method the usual way: before_mount :do_some_more_initialization end