Szukaj…


Wprowadzenie

Ten temat obejmuje integrację React.js z Railsami przy użyciu klejnotu Hyperloop

Inne podejścia nieuwzględnione tutaj to użycie klejnotów reagujących na szyny lub reagujących na szyny.

Uwagi

Klasy komponentów po prostu generują równoważne klasy komponentów javascript.

Możesz także uzyskać dostęp do komponentów javascript i bibliotek bezpośrednio z klas komponentów ruby.

Hyperloop „wstępnie wyrenderuje” stronę serwera widoków, dzięki czemu widok początkowy zostanie załadowany tak samo, jak szablony ERB lub HAML. Po załadowaniu klient zareaguje przejmuje i będzie stopniowo aktualizował DOM wraz ze zmianami stanu na skutek danych wejściowych od użytkownika, żądań HTTP lub przychodzących danych gniazda sieciowego.

Oprócz Składników, Hyperloop ma Sklepy do zarządzania stanem współdzielonym, Operacje do enkapsulacji izomorficznej logiki biznesowej oraz Modele, które zapewniają bezpośredni dostęp do twoich modeli ActiveRecord na kliencie przy użyciu standardowej składni AR.

Więcej informacji tutaj: http://ruby-hyperloop.io/

Dodanie prostego komponentu reagującego (napisanego w rubinie) do aplikacji Rails

  1. Dodaj klejnot hyperloop do swoich szyn (4.0 - 5.1) Gemfile
  2. bundle install
  3. Dodaj manifest hyperloop do pliku application.js:
    // app/assets/javascripts/application.js
    ...
    //= hyperloop-loader
    
  4. Utwórz komponenty reagujące i umieść je w katalogu 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. Komponenty zachowują się jak widoki. Są „montowane” za pomocą metody render_component w kontrolerze:
    # somewhere in a controller:
      ...
      def hello_world
        render_component # renders HelloWorld based on method name
      end
    

Deklarowanie parametrów komponentu (rekwizyty)

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'

Tagi 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

Obsługa zdarzeń

# 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

Stany

# 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

Zauważ, że stany mogą być współużytkowane przez komponenty za pomocą Hyperloop :: Sklepy

Callbacki

# 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow