Ruby on Rails
React.js integreren met rails met behulp van Hyperloop
Zoeken…
Invoering
Dit onderwerp behandelt de integratie van React.js met Rails met behulp van het Hyperloop- juweel
Andere benaderingen die hier niet worden behandeld, zijn de edelstenen react-rails of react_on_rails.
Opmerkingen
Componentklassen genereren eenvoudigweg de equivalente javascript-componentklassen.
Je hebt ook rechtstreeks toegang tot JavaScript-componenten en bibliotheken vanuit je ruby-componentklassen.
Hyperloop zal de weergaveserverzijde "prerender", zodat uw eerste weergave net als ERB- of HAML-sjablonen wordt geladen. Eenmaal geladen op de client neemt React over en zal de DOM stapsgewijs bijwerken als de status verandert als gevolg van invoer van de gebruiker, HTTP-aanvragen of inkomende websocketgegevens.
Naast componenten heeft Hyperloop Stores om de gedeelde status te beheren, Operations om isomorfe bedrijfslogica in te kapselen en Modellen die directe toegang tot uw ActiveRecord-modellen op de client geven met behulp van de standaard AR-syntaxis.
Meer info hier: http://ruby-hyperloop.io/
Een eenvoudig reactiecomponent (in robijn geschreven) toevoegen aan uw Rails-app
- Voeg de hyperloop gem toe aan je rails (4.0 - 5.1) Gemfile
-
bundle install - Voeg het hyperloop-manifest toe aan het bestand application.js:
// app/assets/javascripts/application.js ... //= hyperloop-loader
- Maak uw react-componenten en plaats ze in de
hyperloop/componentsdirectory# 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 - Componenten werken net als weergaven. Ze worden "gekoppeld" met behulp van de methode
render_componentin een controller:# somewhere in a controller: ... def hello_world render_component # renders HelloWorld based on method name end
Componentparameters declareren (rekwisieten)
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 Handlers
# 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
Staten
# 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
Merk op dat toestanden kunnen worden gedeeld tussen componenten met behulp van Hyperloop :: Stores
callbacks
# 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