Skip to content

ReactHelpers API

Helpers for React applications.

Usage

ruby
require 'opal_vite/concerns/v1/react_helpers'

class MyComponent
  include OpalVite::Concerns::V1::ReactHelpers
end

React Access

react

Get React object

ruby
version = react.version

react_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'
end

span(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
end

on_window_event(event_name, &block)

Listen to window events

ruby
on_window_event('resize') do |event|
  handle_resize
end

off_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
end

prompt_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')
end

set_interval(interval_ms, &block)

Repeated execution

ruby
timer = set_interval(5000) do
  poll_updates
end

clear_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)  # => 0

is_nan?(value)

NaN check

ruby
if is_nan?(result)
  use_default_value
end

Example

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

Released under the MIT License.