Recherche…


Introduction

Cette rubrique couvre l’intégration de React.js aux Rails à l’aide du joyau Hyperloop

D'autres approches non couvertes ici utilisent les gemmes react-rails ou react_on_rails.

Remarques

Les classes de composants génèrent simplement les classes de composants javascript équivalents.

Vous pouvez également accéder aux composants et aux bibliothèques javascript directement à partir de vos classes de composants Ruby.

Hyperloop va "prérégler" le côté serveur de vue pour que votre vue initiale se charge exactement comme les modèles ERB ou HAML. Une fois chargée sur le client, la réaction prend le relais et mettra à jour progressivement le DOM en tant que changement d’état dû aux entrées de l’utilisateur, aux requêtes HTTP ou aux données de socket Web entrantes.

Outre les composants, Hyperloop a des magasins pour gérer l'état partagé, les opérations pour encapsuler la logique métier isomorphe et les modèles qui donnent un accès direct à vos modèles ActiveRecord sur le client en utilisant la syntaxe AR standard.

Plus d'infos ici: http://ruby-hyperloop.io/

Ajouter un simple composant de réaction (écrit en ruby) à votre application Rails

  1. Ajoutez le joyau hyperloop à vos rails (4.0 - 5.1) Gemfile
  2. bundle install
  3. Ajoutez le manifeste hyperloop au fichier application.js:
    // app/assets/javascripts/application.js
    ...
    //= hyperloop-loader
    
  4. Créez vos composants de réaction et placez-les dans le 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. Les composants agissent comme des vues. Ils sont "montés" en utilisant la méthode render_component dans un contrôleur:
    # somewhere in a controller:
      ...
      def hello_world
        render_component # renders HelloWorld based on method name
      end
    

Déclaration des paramètres du composant (accessoires)

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'

Balises 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

Gestionnaires d'événements

# 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

États

# 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

Notez que les états peuvent être partagés entre les composants en utilisant Hyperloop :: Stores

Rappels

# 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow