Ruby on Rails
Integración de React.js con Rails usando Hyperloop
Buscar..
Introducción
Este tema trata sobre la integración de React.js con Rails usando la gema Hyperloop
Otros enfoques no cubiertos aquí son usar las gemas react-rails o react_on_rails.
Observaciones
Las clases de componentes simplemente generan las clases de componentes javascript equivalentes.
También puede acceder a los componentes y bibliotecas de javascript directamente desde sus clases de componentes ruby.
Hyperloop "prerenderá" el lado del servidor de la vista, por lo que su vista inicial se cargará como las plantillas ERB o HAML. Una vez que se carga en el cliente, la reacción asume el control y actualizará de forma incremental el DOM a medida que el estado cambia debido a las entradas del usuario, las solicitudes HTTP o los datos de socket web entrantes.
Además de los Componentes, Hyperloop tiene Almacenes para administrar el estado compartido, Operaciones para encapsular la lógica empresarial isomórfica y Modelos que le dan acceso directo a sus modelos ActiveRecord en el cliente usando la sintaxis estándar de AR.
Más información aquí: http://ruby-hyperloop.io/
Agregar un componente de reacción simple (escrito en ruby) a su aplicación Rails
- Agregue la gema hyperloop a sus rieles (4.0 - 5.1) Gemfile
-
bundle install
- Agregue el manifiesto hyperloop al archivo application.js:
// app/assets/javascripts/application.js ... //= hyperloop-loader
- Cree sus componentes de reacción y colóquelos en el directorio
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
- Los componentes actúan como las vistas. Se "montan" utilizando el método
render_component
en un controlador:# somewhere in a controller: ... def hello_world render_component # renders HelloWorld based on method name end
Declaración de parámetros de componentes (props)
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'
Etiquetas HTML
# 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
Controladores de eventos
# 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
Estados
# 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
Tenga en cuenta que los estados se pueden compartir entre componentes utilizando Hyperloop :: Stores
Devoluciones de llamada
# 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