Opal::React
Disclamer
I'm not a rails developer™
You should check out Clearwater and React.rb as well. They are built by rails people and they aim for a more ruby-like experience.
This was done as a proof of concept and for me to learn more about Opal. That being said, this is still supposed to be a complete wrapper around React.
Installation
Add this line to your application's Gemfile:
gem 'opal-react'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install opal-react
Usage
require 'react'
class TodoList < React::Component
def render
console.log('TodoList:render')
ul(
props[:items].map { |item|
li({key: item[:id]}, [ item[:text] ])
}
)
end
end
class TodoApp < React::Component
def initial_state
{ items: [], text: '' }
end
def onChange(e)
set_state({text: e.target.value})
end
def handleSubmit(e)
e.preventDefault()
now = Time.now
nextItems = state[:items] + [{ text: state[:text], id: now.to_i * 1e6 + now.usec }]
nextText = ''
set_state({items: nextItems, text: nextText})
end
def render
div([
h3('TODO'),
TodoList(items: state[:items]),
form({onSubmit: method(:handleSubmit)}, [
input(onChange: method(:onChange), value: state[:text]),
("Add ##{state[:items].count+1}")
])
])
end
end
TodoApp.run()
Extras
React::Window
provides a thin wrapper for common dom operations.
https://developer.mozilla.org/en-US/docs/Web/API/Window has a long list of available properties and methods.
This makes it possible to write fetch("https://...")
and window.setTimeout(-> { ... }, timeout)
anywhere
in your components.
Contributing
- Fork it ( https://github.com/[my-github-username]/opal-react/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request