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_param(name, param_type) ⇒ Object
- #define_state(*states, &block) ⇒ Object
- #define_state_methods(this, name, from = nil, &block) ⇒ Object
- #export_component(opts = {}) ⇒ Object
- #export_state(*states, &block) ⇒ Object
- #imports(component_name) ⇒ Object
- #native_mixin(item) ⇒ Object
- #native_mixins ⇒ Object
- #optional_param(name, options = {}) ⇒ Object
- #param(*args) ⇒ Object
- #params(&block) ⇒ Object
- #process_exception(e, component, reraise = nil) ⇒ Object
- #prop_types ⇒ Object
- #props_wrapper ⇒ Object
- #render(container = nil, params = {}, &block) ⇒ Object
- #required_param(name, options = {}) ⇒ Object (also: #require_param)
- #static_call_back(name, &block) ⇒ Object
- #static_call_backs ⇒ Object
- #validator ⇒ Object
Instance Method Details
#add_item_to_tree(current_tree, new_item) ⇒ Object
201 202 203 204 205 206 207 208 209 210 |
# File 'lib/react/component/class_methods.rb', line 201 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
21 22 23 24 |
# File 'lib/react/component/class_methods.rb', line 21 def append_backtrace(, backtrace) << " #{backtrace[0]}" backtrace[1..-1].each { |line| << line } end |
#backtrace(*args) ⇒ Object
5 6 7 8 |
# File 'lib/react/component/class_methods.rb', line 5 def backtrace(*args) @dont_catch_exceptions = (args[0] == :none) @backtrace_off = @dont_catch_exceptions || (args[0] == :off) end |
#collect_other_params_as(name) ⇒ Object
102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/react/component/class_methods.rb', line 102 def collect_other_params_as(name) validator.allow_undefined_props = true define_method(name) do @_all_others ||= self.class.validator.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
56 57 58 |
# File 'lib/react/component/class_methods.rb', line 56 def default_props validator.default_props end |
#define_param(name, param_type) ⇒ Object
68 69 70 |
# File 'lib/react/component/class_methods.rb', line 68 def define_param(name, param_type) props_wrapper.define_param(name, param_type, self) end |
#define_state(*states, &block) ⇒ Object
114 115 116 117 118 119 120 121 122 |
# File 'lib/react/component/class_methods.rb', line 114 def define_state(*states, &block) 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 } (self.initial_state ||= {}).merge! states_hash states_hash.each do |name, initial_value| define_state_methods(self, name, &block) end end |
#define_state_methods(this, name, from = nil, &block) ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/react/component/class_methods.rb', line 135 def define_state_methods(this, name, from = nil, &block) this.define_method("#{name}") do React::Component.deprecation_warning "Direct access to state `#{name}`. Use `state.#{name}` instead." if from.nil? || from == this State.get_state(from || self, name) end this.define_method("#{name}=") do |new_state| React::Component.deprecation_warning "Direct assignment to state `#{name}`. Use `#{(from && from != this) ? from : 'state'}.#{name}!` instead." yield name, State.get_state(from || self, name), new_state if block && block.arity > 0 State.set_state(from || self, name, new_state) end this.define_method("#{name}!") do |*args| React::Component.deprecation_warning "Direct access to state `#{name}`. Use `state.#{name}` instead." if from.nil? or from == this if args.count > 0 yield name, State.get_state(from || self, name), args[0] if block && block.arity > 0 current_value = State.get_state(from || self, name) State.set_state(from || self, name, args[0]) current_value else current_state = State.get_state(from || self, name) yield name, State.get_state(from || self, name), current_state if block && block.arity > 0 State.set_state(from || self, name, current_state) Observable.new(current_state) do |update| yield name, State.get_state(from || self, name), update if block && block.arity > 0 State.set_state(from || self, name, update) end end end end |
#export_component(opts = {}) ⇒ Object
180 181 182 183 184 185 186 187 |
# File 'lib/react/component/class_methods.rb', line 180 def export_component(opts = {}) export_name = (opts[:as] || name).split('::') first_name = export_name.first Native(`window`)[first_name] = add_item_to_tree( Native(`window`)[first_name], [React::API.create_native_react_class(self)] + export_name[1..-1].reverse ).to_n end |
#export_state(*states, &block) ⇒ Object
124 125 126 127 128 129 130 131 132 133 |
# File 'lib/react/component/class_methods.rb', line 124 def export_state(*states, &block) 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 } State.initialize_states(self, states_hash) states_hash.each do |name, initial_value| define_state_methods(self, name, self, &block) define_state_methods(singleton_class, name, self, &block) end end |
#imports(component_name) ⇒ Object
189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/react/component/class_methods.rb', line 189 def imports(component_name) React::API.import_native_component( self, React::API.eval_native_react_component(component_name) ) define_method(:render) {} # define a dummy render method - will never be called... rescue Exception => e # rubocop:disable Lint/RescueException : we need to catch everything! raise "#{self} cannot import '#{component_name}': #{e.}." # rubocop:enable Lint/RescueException ensure self end |
#native_mixin(item) ⇒ Object
164 165 166 |
# File 'lib/react/component/class_methods.rb', line 164 def native_mixin(item) native_mixins << item end |
#native_mixins ⇒ Object
168 169 170 |
# File 'lib/react/component/class_methods.rb', line 168 def native_mixins @native_mixins ||= [] end |
#optional_param(name, options = {}) ⇒ Object
97 98 99 100 |
# File 'lib/react/component/class_methods.rb', line 97 def optional_param(name, = {}) React::Component.deprecation_warning "`optional_param` is deprecated, use `param param_name: default_value` instead." validator.optional(name, ) end |
#param(*args) ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/react/component/class_methods.rb', line 72 def param(*args) if args[0].is_a? Hash = args[0] name = .first[0] default = .first[1] .delete(name) .merge!({default: default}) else name = args[0] = args[1] || {} end if [:default] validator.optional(name, ) else validator.requires(name, ) end end |
#params(&block) ⇒ Object
60 61 62 |
# File 'lib/react/component/class_methods.rb', line 60 def params(&block) validator.build(&block) end |
#process_exception(e, component, reraise = nil) ⇒ Object
10 11 12 13 14 15 16 17 18 19 |
# File 'lib/react/component/class_methods.rb', line 10 def process_exception(e, component, reraise = nil) = ["Exception raised while rendering #{component}"] if e.backtrace && e.backtrace.length > 1 && !@backtrace_off append_backtrace(, e.backtrace) else [0] += ": #{e.}" end `console.error(#{.join("\n")})` raise e if reraise || @dont_catch_exceptions end |
#prop_types ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/react/component/class_methods.rb', line 40 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 `" + self.name + "`\n" + `errors`.join("\n")}); return #{`errors`.count > 0 ? `error` : `undefined`}; } } } else {} end end |
#props_wrapper ⇒ Object
64 65 66 |
# File 'lib/react/component/class_methods.rb', line 64 def props_wrapper @props_wrapper ||= Class.new(PropsWrapper) end |
#render(container = nil, params = {}, &block) ⇒ Object
26 27 28 29 30 31 32 33 34 |
# File 'lib/react/component/class_methods.rb', line 26 def render(container = nil, params = {}, &block) define_method :render do if container React::RenderingContext.render(container, params) { instance_eval(&block) if block } else instance_eval(&block) end end end |
#required_param(name, options = {}) ⇒ Object Also known as: require_param
90 91 92 93 |
# File 'lib/react/component/class_methods.rb', line 90 def required_param(name, = {}) React::Component.deprecation_warning "`required_param` is deprecated, use `param` instead." validator.requires(name, ) end |
#static_call_back(name, &block) ⇒ Object
172 173 174 |
# File 'lib/react/component/class_methods.rb', line 172 def static_call_back(name, &block) static_call_backs[name] = block end |
#static_call_backs ⇒ Object
176 177 178 |
# File 'lib/react/component/class_methods.rb', line 176 def static_call_backs @static_call_backs ||= {} end |