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

  1. Agregue la gema hyperloop a sus rieles (4.0 - 5.1) Gemfile
  2. bundle install
  3. Agregue el manifiesto hyperloop al archivo application.js:
    // app/assets/javascripts/application.js
    ...
    //= hyperloop-loader
    
  4. 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
    
  5. 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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow