在使用蛋白石时遇到问题并尝试渲染一个简单的 react.rb 模板
Having trouble with opal and trying to render out a simple react.rb template
我正在尝试将 react.rb gem 与蛋白石一起使用,但我遇到了问题。
下面是一个简单的 hello world 组件,没什么复杂的。
class Hello_World
include React::Component
define_state(:message) { "Hello World!" }
def initialize(native)
@native = native
end
def component_will_mount
puts self.message
end
def render
div do
span do
self.message
end
end
end
end
这样做:
puts React.render_to_static_markup(React.create_element(Hello_World))
得到了我所期望的,这个:
Hello World!
<div><span>Hello World!</span></div>
问题是当我尝试将模板渲染到 dom。
这个:
React.render React.create_element(Hello_World), `document.body`
只是给我:
Uncaught Error: Invariant Violation: _registerComponent(...): Target container is not a DOM element.
所以我认为这是因为 document.body
尚不存在,但是以下 none 访问 window 作品(或文档):
window #is undefined
$window # is nil
Window # is undefined
似乎没有用于 JS 等价物的蛋白石命令文档和 none 我可以找到的示例。
我快要拔头发了,我该怎么办?
编辑:
做以下实际工作:
我没有使用 jquery 所以我必须执行以下操作才能获得 document.ready
:
document.ready = function (event) {
document.addEventListener("DOMContentLoaded", event)
}
%x|document.ready(function(){
#{
React.render React.create_element(Hello_World), `document.getElementById('mount_point')`
}
})|
但这太老套了。
问题是 body.getElementById('mount_point')
返回 nil,这是因为脚本在 dom 准备好之前执行。
因为我没有使用 Jquery 并且由于某种原因我无法访问文档对象,所以我遇到了麻烦。
虽然最后我能够创建一个方法来为我处理这个问题。
所以,定义这个:
def ready
%x|document.addEventListener("DOMContentLoaded", function(){
#{yield}
})|
end
允许我做:
ready do
React.render React.create_element(Hello_World), `document.getElementById('mount_point')`
end
我正在尝试将 react.rb gem 与蛋白石一起使用,但我遇到了问题。
下面是一个简单的 hello world 组件,没什么复杂的。
class Hello_World
include React::Component
define_state(:message) { "Hello World!" }
def initialize(native)
@native = native
end
def component_will_mount
puts self.message
end
def render
div do
span do
self.message
end
end
end
end
这样做:
puts React.render_to_static_markup(React.create_element(Hello_World))
得到了我所期望的,这个:
Hello World!
<div><span>Hello World!</span></div>
问题是当我尝试将模板渲染到 dom。
这个:
React.render React.create_element(Hello_World), `document.body`
只是给我:
Uncaught Error: Invariant Violation: _registerComponent(...): Target container is not a DOM element.
所以我认为这是因为 document.body
尚不存在,但是以下 none 访问 window 作品(或文档):
window #is undefined
$window # is nil
Window # is undefined
似乎没有用于 JS 等价物的蛋白石命令文档和 none 我可以找到的示例。
我快要拔头发了,我该怎么办?
编辑:
做以下实际工作:
我没有使用 jquery 所以我必须执行以下操作才能获得 document.ready
:
document.ready = function (event) {
document.addEventListener("DOMContentLoaded", event)
}
%x|document.ready(function(){
#{
React.render React.create_element(Hello_World), `document.getElementById('mount_point')`
}
})|
但这太老套了。
问题是 body.getElementById('mount_point')
返回 nil,这是因为脚本在 dom 准备好之前执行。
因为我没有使用 Jquery 并且由于某种原因我无法访问文档对象,所以我遇到了麻烦。 虽然最后我能够创建一个方法来为我处理这个问题。
所以,定义这个:
def ready
%x|document.addEventListener("DOMContentLoaded", function(){
#{yield}
})|
end
允许我做:
ready do
React.render React.create_element(Hello_World), `document.getElementById('mount_point')`
end