Class: React::Sinatra::Component

Inherits:
Object
  • Object
show all
Includes:
Padrino::Helpers::OutputHelpers, Padrino::Helpers::TagHelpers
Defined in:
lib/react/sinatra/component.rb

Overview

Class for expressing react component.

This is main entrypoint for rendering react component

and is referred from {React::Sinatra::Helpers#react_component}.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(component, prerender: false, **options) ⇒ React::Sinatra::Component

Constructs an instance of React::Sinatra::Component.

Parameters:

  • component (String)

    The name for component must be able to be referred from asset javascript

  • prerender (TrueClass, FalseClass) (defaults to: false)

    Whether server side rendering is enabled or not.



60
61
62
63
# File 'lib/react/sinatra/component.rb', line 60

def initialize(component, prerender: false, **options)
  @component = component
  @prerender = prerender
end

Instance Attribute Details

#componentObject (readonly)

Returns the value of attribute component.



17
18
19
# File 'lib/react/sinatra/component.rb', line 17

def component
  @component
end

#prerenderObject (readonly)

Returns the value of attribute prerender.



17
18
19
# File 'lib/react/sinatra/component.rb', line 17

def prerender
  @prerender
end

#propsObject (readonly)

Returns the value of attribute props.



17
18
19
# File 'lib/react/sinatra/component.rb', line 17

def props
  @props
end

Class Method Details

.camelize_props(props) ⇒ Hash

Camelizes props for enabling camelize_props option.

Parameters:

  • props (Hash)

    The props for rendering react-dom

Returns:

  • (Hash)

    camelized props



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/react/sinatra/component.rb', line 40

def self.camelize_props(props)
  case props
  when Hash
    props.each_with_object({}) do |(key, value), new_props|
      new_key = key.to_s.camelize(:lower)
      new_value = camelize_props(value)
      new_props[new_key] = new_value
    end
  when Array
    props.map(&method(:camelize_props))
  else
    props
  end
end

.render(component, props, prerender: false, **options) ⇒ ActiveSupport::SafeBuffer

Renders react component from given arguments.

Examples:

React::Sinatra::Component.render('Hello', { name: 'namusyaka' }, prerender: true)

Parameters:

  • component (String)

    The name for component must be able to be referred from asset javascript.

  • props (Hash)

    The props for rendering react-dom

  • prerender (TrueClass, FalseClass) (defaults to: false)

    Whether server side rendering is enabled or not.

  • camelize_props (TrueClass, FalseClass)

    Whether camelization is enabled or not.

  • tag (String, Symbol)

    The tag name for rendering react root element. Defaults to :div

Returns:

  • (ActiveSupport::SafeBuffer)

    safe string for rendering in application views

Raises:



32
33
34
# File 'lib/react/sinatra/component.rb', line 32

def self.render(component, props, prerender: false, **options)
  new(component, prerender: prerender).render(props, **options)
end

Instance Method Details

#render(props, camelize_props: false, tag: :div, **options, &block) ⇒ ActiveSupport::SafeBuffer

Renders react component from given arguments and component.

Parameters:

  • props (Hash)

    The props for rendering react-dom

  • camelize_props (TrueClass, FalseClass) (defaults to: false)

    Whether camelization is enabled or not

  • tag (String, Symbol) (defaults to: :div)

    The tag name for rendering react root element. Defaults to :div

Returns:

  • (ActiveSupport::SafeBuffer)

    safe string for rendering in application views

See Also:



72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/react/sinatra/component.rb', line 72

def render(props, camelize_props: false, tag: :div, **options, &block)
  props = self.class.camelize_props(props) if camelize_props
  block = -> {
    concat React::Sinatra::Pool.render(component, props.to_json)
  } if prerender?

  options.reverse_merge!(data: {})
  options[:data].tap do |data|
    data[:react_class] = component
    data[:react_props] = props.is_a?(String) ? props : props.to_json
  end unless prerender == :static

  (tag, '', options, &block)
end