ReactHelpers API
Helpers for React applications.
Usage
ruby
require 'opal_vite/concerns/v1/react_helpers'
class MyComponent
include OpalVite::Concerns::V1::ReactHelpers
endReact Access
react
Get React object
ruby
version = react.versionreact_dom
Get ReactDOM object
ruby
root = react_dom.createRoot(container)Element Creation
el(type, props = nil, *children)
Create React element (generic)
ruby
el('div', { className: 'container' },
el('h1', nil, 'Title'),
el('p', nil, 'Content')
)div(props = nil, *children, &block)
Create div element
ruby
div({ className: 'wrapper' }, 'Content')
# Block form
div({ className: 'wrapper' }) do
'Dynamic content'
endspan(props = nil, *children, &block)
Create span element
ruby
span({ className: 'highlight' }, 'Text')button(props = nil, *children, &block)
Create button element
ruby
button({ onClick: handler }, 'Click me')paragraph(props = nil, *children, &block)
Create p element
ruby
paragraph({ className: 'description' }, 'Paragraph text')h1(props = nil, *children) / h2 / h3
Create heading elements
ruby
h1(nil, 'Main Title')
h2({ className: 'section-title' }, 'Section')DOM
query(selector) / query_all(selector)
Query elements
ruby
container = query('#root')
items = query_all('.item')get_element_by_id(id)
Get element by ID
ruby
root = get_element_by_id('root')create_element(tag)
Create DOM element
ruby
div = create_element('div')set_html(element, html) / set_text(element, text)
Set innerHTML / textContent
ruby
set_html(element, '<strong>Bold</strong>')
set_text(element, 'Plain text')add_class(element, *classes) / remove_class(element, *classes)
Add/remove classes
ruby
add_class(element, 'active', 'visible')
remove_class(element, 'hidden')Events
on_dom_ready(&block)
Execute when DOM is ready
ruby
on_dom_ready do
render_app
endon_window_event(event_name, &block)
Listen to window events
ruby
on_window_event('resize') do |event|
handle_resize
endoff_window_event(event_name, handler)
Remove event listener
ruby
off_window_event('resize', resize_handler)Dialogs
alert_message(message)
Show alert
ruby
alert_message('Operation completed')confirm_message(message)
Show confirm dialog
ruby
if confirm_message('Delete this item?')
delete_item
endprompt_message(message, default_value = '')
Show input dialog
ruby
name = prompt_message('Enter name', 'Anonymous')Timing
set_timeout(delay_ms, &block)
Delayed execution
ruby
set_timeout(1000) do
console_log('After 1 second')
endset_interval(interval_ms, &block)
Repeated execution
ruby
timer = set_interval(5000) do
poll_updates
endclear_timeout(id) / clear_interval(id)
Clear timer
ruby
clear_interval(timer)LocalStorage
storage_get(key) / storage_set(key, value)
LocalStorage operations
ruby
storage_set('theme', 'dark')
theme = storage_get('theme')storage_remove(key)
Remove key
ruby
storage_remove('temp')Fetch API
fetch_url(url, options = nil)
Execute fetch (returns Promise)
ruby
promise = fetch_url('/api/data')
promise.then { |response| response.json }
.then { |data| process(data) }JSON
parse_json(json_string)
Parse JSON
ruby
data = parse_json('{"key": "value"}')to_json(object)
Convert to JSON string
ruby
json = to_json({ key: 'value' })Console
console_log(*args) / console_warn(*args) / console_error(*args)
Console output
ruby
console_log('Debug:', data)Global
window_get(key) / window_set(key, value)
Window property access
ruby
window_set('myApp', app_instance)
app = window_get('myApp')window_delete(key)
Delete window property
ruby
window_delete('tempData')Type Conversion
parse_int(value, radix = 10) / parse_float(value)
Number parsing
ruby
num = parse_int('42')
float = parse_float('3.14')parse_int_or(value, default = 0) / parse_float_or(value, default = 0.0)
Parse with default
ruby
num = parse_int_or('abc', 0) # => 0is_nan?(value)
NaN check
ruby
if is_nan?(result)
use_default_value
endExample
ruby
require 'opal_vite/concerns/v1/react_helpers'
class CounterComponent
include OpalVite::Concerns::V1::ReactHelpers
def initialize
@count = 0
end
def render
div({ className: 'counter' },
h1(nil, 'Counter'),
paragraph({ className: 'count' }, @count.to_s),
button({ onClick: method(:increment) }, '+'),
button({ onClick: method(:decrement) }, '-'),
button({ onClick: method(:reset) }, 'Reset')
)
end
def increment
@count += 1
rerender
end
def decrement
@count -= 1
rerender
end
def reset
@count = 0
rerender
end
end
# Mount
on_dom_ready do
root = react_dom.createRoot(get_element_by_id('root'))
component = CounterComponent.new
root.render(component.render)
end