如何在react-rails组件中调用rails-assets.org中的react-modal

时间:2016-03-03 07:46:23

标签: ruby-on-rails reactjs react-rails rails-assets

我有一个使用前端反应的rails应用程序但是我在将其他反应模块添加到我的组件时遇到了问题。我正在使用react-rails将react整合到我的rails应用中。我想将react-modal添加到组件中。我已经使用rails-assets添加react-modal作为gem但我在组件中调用react-modal时遇到了麻烦。我希望它可以像React.DOM一样进行类似的调用,但似乎并非如此。

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

所以,为了清楚我想在我的组件中显示模态,到目前为止,我得到一个错误,返回“模态未定义”。谢谢你的帮助。

这是rails-assets sourced gem:

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

的application.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"

2 个答案:

答案 0 :(得分:2)

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

如果您使用的是react-modal-bootstrap

//= require react-modal-bootstrap

可用的组件将是:

<ReactModalBoostrap.Modal />

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

另请记住在运行bundle install

后重新启动服务器

答案 1 :(得分:0)

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

在我的application.html.erb

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

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

我将整个React App添加到<div>。由于Rails视图通常有不同的路由,我将在app.js中使用类似的方式处理路由,只在需要时呈现我需要的路径:

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

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