class React::Rails::ComponentMount

This is the default view helper implementation. It just inserts HTML into the DOM (see {#react_component}).

You can extend this class or provide your own implementation by assigning it to ‘config.react.view_helper_implementation`.

Attributes

output_buffer[RW]

Public Class Methods

new() click to toggle source
# File lib/react/rails/component_mount.rb, line 14
def initialize
  @cache_ids = []
end

Public Instance Methods

react_component(name, props = {}, options = {}, &block) click to toggle source

Render a UJS-type HTML tag annotated with data attributes, which are used by react_ujs to actually instantiate the React component on the client.

# File lib/react/rails/component_mount.rb, line 30
def react_component(name, props = {}, options = {}, &block)
  options = { :tag => options } if options.is_a?(Symbol)
  if options.fetch(:camelize_props, camelize_props_switch)
    props = React.camelize_props(props)
  end

  prerender_options = options[:prerender]
  if prerender_options
    block = Proc.new{ concat(prerender_component(name, props, prerender_options)) }
  end

  html_options = options.reverse_merge(:data => {})
  unless prerender_options == :static
    html_options[:data].tap do |data|
      data[:react_class] = name
      data[:react_props] = (props.is_a?(String) ? props : props.to_json)
      data[:hydrate] = 't' if prerender_options

      num_components = @cache_ids.count { |c| c.start_with? name }
      data[:react_cache_id] = "#{name}-#{num_components}"
    end
  end
  html_tag = html_options[:tag] || :div

  # remove internally used properties so they aren't rendered to DOM
  html_options.except!(:tag, :prerender, :camelize_props)

  rendered_tag = content_tag(html_tag, '', html_options, &block)
  if React::ServerRendering.renderer_options[:replay_console]
    # Grab the server-rendered console replay script
    # and move it _outside_ the container div
    rendered_tag.sub!(/\n(<script class="react-rails-console-replay">.*<\/script>)<\/(\w+)>$/m,'</\2>\1')
    rendered_tag.html_safe
  else
    rendered_tag
  end
end
setup(controller) click to toggle source

{ControllerLifecycle} calls these hooks You can use them in custom helper implementations

# File lib/react/rails/component_mount.rb, line 20
def setup(controller)
  @controller = controller
end
teardown(controller) click to toggle source
# File lib/react/rails/component_mount.rb, line 24
def teardown(controller)
end

Private Instance Methods

prerender_component(component_name, props, prerender_options) click to toggle source

If this controller has checked out a renderer, use that one. Otherwise, use {React::ServerRendering} directly (which will check one out for this rendering).

# File lib/react/rails/component_mount.rb, line 72
def prerender_component(component_name, props, prerender_options)
  renderer = @controller.try(:react_rails_prerenderer) || React::ServerRendering
  renderer.render(component_name, props, prerender_options)
end