Ruby on Rails
Integracja React.js z Railsami przy użyciu Hyperloop
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
- Dodaj klejnot hyperloop do swoich szyn (4.0 - 5.1) Gemfile
-
bundle install
- Dodaj manifest hyperloop do pliku application.js:
// app/assets/javascripts/application.js ... //= hyperloop-loader
- 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
- 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