Module: React::Component

Included in:
Components::HelloWorld, Components::Todo, TopLevelRailsComponent
Defined in:
lib/react/component.rb,
lib/react/component/api.rb,
lib/react/component/base.rb,
lib/react/component/tags.rb,
lib/react/component/class_methods.rb,
lib/react/component/props_wrapper.rb,
lib/react/component/dsl_instance_methods.rb

Defined Under Namespace

Modules: API, ClassMethods, DslInstanceMethods, Tags Classes: Base, PropsWrapper

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#waiting_on_resourcesObject (readonly)

Returns the value of attribute waiting_on_resources.



139
140
141
# File 'lib/react/component.rb', line 139

def waiting_on_resources
  @waiting_on_resources
end

Class Method Details

.deprecation_warning(message) ⇒ Object



32
33
34
35
36
37
38
39
# File 'lib/react/component.rb', line 32

def self.deprecation_warning(message)
  @deprecation_messages ||= []
  message = "Warning: Deprecated feature used in #{name}. #{message}"
  unless @deprecation_messages.include? message
    @deprecation_messages << message
    IsomorphicHelpers.log message, :warning
  end
end

.included(base) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/react/component.rb', line 15

def self.included(base)
  base.include(API)
  base.include(Callbacks)
  base.include(Tags)
  base.include(DslInstanceMethods)
  base.class_eval do
    class_attribute :initial_state
    define_callback :before_mount
    define_callback :after_mount
    define_callback :before_receive_props
    define_callback :before_update
    define_callback :after_update
    define_callback :before_unmount
  end
  base.extend(ClassMethods)
end

Instance Method Details

#_render_wrapperObject



141
142
143
144
145
146
147
# File 'lib/react/component.rb', line 141

def _render_wrapper
  State.set_state_context_to(self) do
    React::RenderingContext.render(nil) {render || ""}.tap { |element| @waiting_on_resources = element.waiting_on_resources if element.respond_to? :waiting_on_resources }
  end
rescue Exception => e
  self.class.process_exception(e, self)
end

#component_did_mountObject



71
72
73
74
75
76
77
78
# File 'lib/react/component.rb', line 71

def component_did_mount
  State.set_state_context_to(self) do
    self.run_callback(:after_mount)
    State.update_states_to_observe
  end
rescue Exception => e
  self.class.process_exception(e, self)
end

#component_did_update(prev_props, prev_state) ⇒ Object



121
122
123
124
125
126
127
128
# File 'lib/react/component.rb', line 121

def component_did_update(prev_props, prev_state)
  State.set_state_context_to(self) do
    self.run_callback(:after_update, Hash.new(prev_props), Hash.new(prev_state))
    State.update_states_to_observe
  end
rescue Exception => e
  self.class.process_exception(e, self)
end

#component_will_mountObject



61
62
63
64
65
66
67
68
69
# File 'lib/react/component.rb', line 61

def component_will_mount
  IsomorphicHelpers.load_context(true) if IsomorphicHelpers.on_opal_client?
  @props_wrapper = self.class.props_wrapper.new(Hash.new(`#{@native}.props`))
  set_state! initial_state if initial_state
  State.initialize_states(self, initial_state)
  State.set_state_context_to(self) { self.run_callback(:before_mount) }
rescue Exception => e
  self.class.process_exception(e, self)
end

#component_will_receive_props(next_props) ⇒ Object



80
81
82
83
84
85
86
# File 'lib/react/component.rb', line 80

def component_will_receive_props(next_props)
  # need to rethink how this works in opal-react, or if its actually that useful within the react.rb environment
  # for now we are just using it to clear processed_params
  State.set_state_context_to(self) { self.run_callback(:before_receive_props, Hash.new(next_props)) }
rescue Exception => e
  self.class.process_exception(e, self)
end

#component_will_unmountObject



130
131
132
133
134
135
136
137
# File 'lib/react/component.rb', line 130

def component_will_unmount
  State.set_state_context_to(self) do
    self.run_callback(:before_unmount)
    State.remove
  end
rescue Exception => e
  self.class.process_exception(e, self)
end

#component_will_update(next_props, next_state) ⇒ Object



114
115
116
117
118
119
# File 'lib/react/component.rb', line 114

def component_will_update(next_props, next_state)
  State.set_state_context_to(self) { self.run_callback(:before_update, Hash.new(next_props), Hash.new(next_state)) }
  @props_wrapper = self.class.props_wrapper.new(Hash.new(next_props), @props_wrapper)
rescue Exception => e
  self.class.process_exception(e, self)
end

#define_state(*args, &block) ⇒ Object



153
154
155
# File 'lib/react/component.rb', line 153

def define_state(*args, &block)
  State.initialize_states(self, self.class.define_state(*args, &block))
end

#deprecated_params_method(name, *args, &block) ⇒ Object



4
5
6
7
# File 'lib/react/component/props_wrapper.rb', line 4

def deprecated_params_method(name, *args, &block)
  React::Component.deprecation_warning"Direct access to param `#{name}`.  Use `params.#{name}` instead."
  params.send(name, *args, &block)
end

#emit(event_name, *args) ⇒ Object



57
58
59
# File 'lib/react/component.rb', line 57

def emit(event_name, *args)
  self.params["_on#{event_name.to_s.event_camelize}"].call(*args)
end

#initialize(native_element) ⇒ Object



41
42
43
# File 'lib/react/component.rb', line 41

def initialize(native_element)
  @native = native_element
end

#props_changed?(next_props) ⇒ Boolean

Returns:

  • (Boolean)


88
89
90
91
# File 'lib/react/component.rb', line 88

def props_changed?(next_props)
  return true unless props.keys.sort == next_props.keys.sort
  props.detect { |k, v| `#{next_props[k]} != #{params[k]}`}
end

#renderObject



45
46
47
# File 'lib/react/component.rb', line 45

def render
  raise "no render defined"
end

#should_component_update?(next_props, next_state) ⇒ Boolean

Returns:

  • (Boolean)


93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/react/component.rb', line 93

def should_component_update?(next_props, next_state)
  State.set_state_context_to(self) do
    next_props = Hash.new(next_props)
    if self.respond_to?(:needs_update?)
      !!self.needs_update?(next_props, Hash.new(next_state))
    elsif false # switch to true to force updates per standard react
      true
    elsif props_changed? next_props
      true
    elsif `!next_state != !#{@native}.state`
      true
    elsif `!next_state && !#{@native}.state`
      false
    elsif `next_state["***_state_updated_at-***"] != #{@native}.state["***_state_updated_at-***"]`
      true
    else
      false
    end.to_n
  end
end

#update_react_js_state(object, name, value) ⇒ Object



49
50
51
52
53
54
55
# File 'lib/react/component.rb', line 49

def update_react_js_state(object, name, value)
  if object
    set_state({"***_state_updated_at-***" => Time.now.to_f, "#{object.class.to_s+'.' unless object == self}#{name}" => value})
  else
    set_state({name => value})
  end rescue nil
end

#watch(value, &on_change) ⇒ Object



149
150
151
# File 'lib/react/component.rb', line 149

def watch(value, &on_change)
  Observable.new(value, on_change)
end