如何使用react-rails gem预渲染命名空间的反应组件?

时间:2014-10-11 06:52:00

标签: javascript ruby-on-rails ruby reactjs

(注意:我正在使用'therubyracer','react-rails'和'sprockets-coffee-react'宝石)

这是我的简单组件(Hello.js.cjsx)的代码:

# @cjsx React.DOM

Hello = React.createClass(
  render: ->
    <div>
      Hello {@props.name || "World"}!
    </div>
)

window.components ?= {}
window.components.Hello = Hello

在我的rails视图(index.html.erb)中,这很好用:

<%= render_component('components.Hello', {name: 'Jack'}) %>

然而,当我尝试这个时:

<%= react_component('components.Hello', {name: 'Jill'}, {prerender: true}) %>

我收到此错误:

Encountered error "ReferenceError: components is not defined"

这看起来很奇怪,因为我在我的组件中定义它。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

问题是,对于使用render_component呈现的任何内容,它要求使用全局window对象注册该组件。这有点不理想,但它暂时如何运作。

这就是我一直在做的事情。不理想,但有帮助。

components /
    namespace /
       MyComponent.js.jsx

然后在我的文件中执行此操作:

# components/namespace/MyComponent.js.jsx

window.NamespaceMyComponent = React.createClass({});

module.exports = window.NamespaceMyComponent;

这最后一部分允许我使用browserify并要求我的模块如下:

require('components/namespace/MyComponent')

并使用render_component这样的帮助:

<%= render_component "NamespaceMyComponent", {}, {prerender: true} %>

答案 1 :(得分:1)

我不确定您使用的语法。 请替换以下行:

window.components ?= {}
window.components.Hello = Hello

window.Hello = Hello

(您可以按照this link了解更多示例)。