Module: React::Component::ClassMethods
- Defined in:
- lib/react/component/class_methods.rb
Overview
class level methods (macros) for components
Instance Method Summary
collapse
-
#add_item_to_tree(current_tree, new_item) ⇒ Object
-
#append_backtrace(message_array, backtrace) ⇒ Object
-
#backtrace(*args) ⇒ Object
-
#collect_other_params_as(name) ⇒ Object
-
#default_props ⇒ Object
-
#define_state(*states, &block) ⇒ Object
-
#deprecation_warning(message) ⇒ Object
-
#export_component(opts = {}) ⇒ Object
-
#export_state(*states, &block) ⇒ Object
-
#imports(component_name) ⇒ Object
-
#method_missing(name, *args, &children) ⇒ Object
method missing will assume the method is a class name, and will treat this a render of of the component, i.e.
-
#native_mixin(item) ⇒ Object
-
#native_mixins ⇒ Object
-
#param(*args) ⇒ Object
-
#params(&block) ⇒ Object
-
#process_exception(e, component, reraise = @dont_catch_exceptions) ⇒ Object
-
#prop_types ⇒ Object
-
#props_wrapper ⇒ Object
-
#reactrb_component? ⇒ Boolean
-
#render(container = nil, params = {}, &block) ⇒ Object
-
#static_call_back(name, &block) ⇒ Object
-
#static_call_backs ⇒ Object
-
#validator ⇒ Object
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &children) ⇒ Object
method missing will assume the method is a class name, and will treat this a render of of the component, i.e. Foo::Bar.baz === Foo::Bar().baz
49
50
51
52
53
54
|
# File 'lib/react/component/class_methods.rb', line 49
def method_missing(name, *args, &children)
Object.method_missing(name, *args, &children) unless args.empty?
React::RenderingContext.render(
self, class: React::Element.haml_class_name(name), &children
)
end
|
Instance Method Details
#add_item_to_tree(current_tree, new_item) ⇒ Object
177
178
179
180
181
182
183
184
185
186
|
# File 'lib/react/component/class_methods.rb', line 177
def add_item_to_tree(current_tree, new_item)
if Native(current_tree).class != Native::Object || new_item.length == 1
new_item.inject { |a, e| { e => a } }
else
Native(current_tree)[new_item.last] = add_item_to_tree(
Native(current_tree)[new_item.last], new_item[0..-2]
)
current_tree
end
end
|
#append_backtrace(message_array, backtrace) ⇒ Object
30
31
32
33
|
# File 'lib/react/component/class_methods.rb', line 30
def append_backtrace(message_array, backtrace)
message_array << " #{backtrace[0]}"
backtrace[1..-1].each { |line| message_array << line }
end
|
#backtrace(*args) ⇒ Object
14
15
16
17
|
# File 'lib/react/component/class_methods.rb', line 14
def backtrace(*args)
@dont_catch_exceptions = (args[0] == :none)
@backtrace_off = @dont_catch_exceptions || (args[0] == :off)
end
|
#collect_other_params_as(name) ⇒ Object
106
107
108
109
110
111
112
113
114
115
116
117
|
# File 'lib/react/component/class_methods.rb', line 106
def collect_other_params_as(name)
validator.allow_undefined_props = true
validator_in_lexical_scope = validator
props_wrapper.define_method(name) do
@_all_others ||= validator_in_lexical_scope.undefined_props(props)
end
validator_in_lexial_scope = validator
props_wrapper.define_method(name) do
@_all_others ||= validator_in_lexial_scope.undefined_props(props)
end
end
|
#default_props ⇒ Object
76
77
78
|
# File 'lib/react/component/class_methods.rb', line 76
def default_props
validator.default_props
end
|
#define_state(*states, &block) ⇒ Object
119
120
121
122
123
124
125
|
# File 'lib/react/component/class_methods.rb', line 119
def define_state(*states, &block)
deprecation_warning "'define_state' is deprecated. Use the 'state' macro to declare states."
default_initial_value = (block && block.arity == 0) ? yield : nil
states_hash = (states.last.is_a?(Hash)) ? states.pop : {}
states.each { |name| state(name => default_initial_value) }
states_hash.each { |name, value| state(name => value) }
end
|
#deprecation_warning(message) ⇒ Object
6
7
8
|
# File 'lib/react/component/class_methods.rb', line 6
def deprecation_warning(message)
React::Component.deprecation_warning(self, message)
end
|
#export_component(opts = {}) ⇒ Object
156
157
158
159
160
161
162
163
|
# File 'lib/react/component/class_methods.rb', line 156
def export_component(opts = {})
export_name = (opts[:as] || name).split('::')
first_name = export_name.first
Native(`Opal.global`)[first_name] = add_item_to_tree(
Native(`Opal.global`)[first_name],
[React::API.create_native_react_class(self)] + export_name[1..-1].reverse
).to_n
end
|
#export_state(*states, &block) ⇒ Object
127
128
129
130
131
132
133
134
135
136
137
138
|
# File 'lib/react/component/class_methods.rb', line 127
def export_state(*states, &block)
deprecation_warning "'export_state' is deprecated. Use the 'state' macro to declare states."
default_initial_value = (block && block.arity == 0) ? yield : nil
states_hash = (states.last.is_a?(Hash)) ? states.pop : {}
states.each { |name| states_hash[name] = default_initial_value }
states_hash.each do |name, value|
state(name => value, scope: :class, reader: true)
singleton_class.define_method("#{name}!") do |*args|
mutate.__send__(name, *args)
end
end
end
|
#imports(component_name) ⇒ Object
165
166
167
168
169
170
171
172
173
174
175
|
# File 'lib/react/component/class_methods.rb', line 165
def imports(component_name)
React::API.import_native_component(
self, React::API.eval_native_react_component(component_name)
)
define_method(:render) {}
rescue Exception => e
raise "#{self} cannot import '#{component_name}': #{e.message}."
ensure
self
end
|
#native_mixin(item) ⇒ Object
140
141
142
|
# File 'lib/react/component/class_methods.rb', line 140
def native_mixin(item)
native_mixins << item
end
|
#native_mixins ⇒ Object
144
145
146
|
# File 'lib/react/component/class_methods.rb', line 144
def native_mixins
@native_mixins ||= []
end
|
#param(*args) ⇒ Object
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
# File 'lib/react/component/class_methods.rb', line 88
def param(*args)
if args[0].is_a? Hash
options = args[0]
name = options.first[0]
default = options.first[1]
options.delete(name)
options.merge!({default: default})
else
name = args[0]
options = args[1] || {}
end
if options[:default]
validator.optional(name, options)
else
validator.requires(name, options)
end
end
|
#params(&block) ⇒ Object
80
81
82
|
# File 'lib/react/component/class_methods.rb', line 80
def params(&block)
validator.build(&block)
end
|
#process_exception(e, component, reraise = @dont_catch_exceptions) ⇒ Object
19
20
21
22
23
24
25
26
27
28
|
# File 'lib/react/component/class_methods.rb', line 19
def process_exception(e, component, reraise = @dont_catch_exceptions)
unless @dont_catch_exceptions
message = ["Exception raised while rendering #{component}: #{e.message}"]
if e.backtrace && e.backtrace.length > 1 && !@backtrace_off
append_backtrace(message, e.backtrace)
end
`console.error(#{message.join("\n")})`
end
raise e if reraise
end
|
#prop_types ⇒ Object
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
# File 'lib/react/component/class_methods.rb', line 60
def prop_types
if self.validator
{
_componentValidator: %x{
function(props, propName, componentName) {
var errors = #{validator.validate(Hash.new(`props`))};
var error = new Error(#{"In component `#{name}`\n" + `errors`.join("\n")});
return #{`errors`.count > 0 ? `error` : `undefined`};
}
}
}
else
{}
end
end
|
#props_wrapper ⇒ Object
84
85
86
|
# File 'lib/react/component/class_methods.rb', line 84
def props_wrapper
@props_wrapper ||= Class.new(PropsWrapper)
end
|
#reactrb_component? ⇒ Boolean
10
11
12
|
# File 'lib/react/component/class_methods.rb', line 10
def reactrb_component?
true
end
|
#render(container = nil, params = {}, &block) ⇒ Object
35
36
37
38
39
40
41
42
43
44
|
# File 'lib/react/component/class_methods.rb', line 35
def render(container = nil, params = {}, &block)
if container
container = container.type if container.is_a? React::Element
define_method :render do
React::RenderingContext.render(container, params) { instance_eval(&block) if block }
end
else
define_method(:render) { instance_eval(&block) }
end
end
|
#static_call_back(name, &block) ⇒ Object
148
149
150
|
# File 'lib/react/component/class_methods.rb', line 148
def static_call_back(name, &block)
static_call_backs[name] = block
end
|
#static_call_backs ⇒ Object
152
153
154
|
# File 'lib/react/component/class_methods.rb', line 152
def static_call_backs
@static_call_backs ||= {}
end
|
#validator ⇒ Object
56
57
58
|
# File 'lib/react/component/class_methods.rb', line 56
def validator
@validator ||= Validator.new(props_wrapper)
end
|