2

我有一个在前端使用 react 的 rails 应用程序,但在向我的组件中添加其他 react 模块时遇到问题。我正在使用react-rails将 react 合并到我的 rails 应用程序中。我想将react-modal添加到组件中。我使用 rails-assets 将 react-modal 添加为 gem,但在组件中调用 react-modal 时遇到问题。我希望这将是一个与 React.DOM 类似的调用,但似乎并非如此。

由于链轮,我不能使用正常的 'require()' 语法,我想坚持使用 rails-assets 而不是 browserify/webpack 解决方案。

因此,为了清楚起见,我想在我的组件中显示模态,截至目前,我收到一个错误,提示“未定义模态”。谢谢你的帮助。

这是来自 rails-assets 的 gem:

### Rails Assets Gems
source 'https://rails-assets.org' do
  gem 'rails-assets-react-modal'
end

应用程序.js

//= require react
//= require react_ujs
//= require react-modal
//= require components

这是我的组件:

customStyles = content:
  top: '50%'
  left: '50%'
  right: 'auto'
  bottom: 'auto'
  marginRight: '-50%'
  transform: 'translate(-50%, -50%)'

DOM = React.DOM
@EntityBulkTracker = React.createClass
  displayName: 'EntityBulkTracker'

  getInitialState: ->
    entity: @props.entity
    modalIsOpen: true

  openModal: (e) ->
    @setState modalIsOpen: true

  closeModal: (e) ->
    @setState modalIsOpen: false

  render: ->
    DOM.div null,
      Modal
        isOpen: @state.modalIsOpen
        onRequestClose: @closeModal
        style: "#{customStyles}"

        DOM.h2 null,
          "Hello"
        DOM.input
          type: 'button'
          onClick: @closeModal
        DOM.div null,
          "I am a modal"
4

2 回答 2

2

当您需要使用 sprockets 的组件时,它将作为全局对象提供,该组件将具有与包相同的名称,例如:

如果你正在使用react-modal-bootstrap

//= require react-modal-bootstrap

可用的组件将是:

<ReactModalBoostrap.Modal />

它应该对您正在使用的模式起作用,因此<Modal />您应该使用而不是使用<ReactModal.Modal />

还记得在运行后重新启动服务器bundle install

于 2016-03-09T16:43:51.587 回答
0

通常,当我在 Rails 中使用 React 时,我会遵循这种模式:

在我的 application.html.erb

    <div id="react-app"> </div>

    <div class="main-content">
      <%= yield %>
       <%= javascript_include_tag 'bundle' %>
    </div>

那个<div>将是我将整个 React 应用程序附加到的内容。由于 Rails 视图通常有不同的路由,我将在我的 app.js 中使用类似这样的方式处理路由,仅在需要时呈现我需要的内容:

      _renderSpecificComponents () {
        return (
          window.location.pathname === '/users/sign_in' ? (
            <Login />
          ) : (
            <Header />
          )
        );

如果您不想遵循这样的模式,我的一个建议是确保您在 Modal 中要求您的特定组件,而不仅仅是 App.js。

于 2016-03-03T18:51:57.793 回答