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

How to call react-modal from rails-assets.org in react-rails component

我有一个 rails 应用程序在前端使用 React,但我无法将其他 React 模块添加到我的组件。我正在对一个组件使用 react-rails for incorporating react into my rails app. I would like to add react-modal。我已经使用 rails-assets 将 react-modal 添加为 gem 但我在组件中调用 react-modal 时遇到问题。我希望这将是一个与 React.DOM 类似的调用,但事实并非如此。

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

所以为了清楚起见,我想在我的组件中显示模态,但截至目前,我收到了一个错误返回 'Modal is not defined'。感谢您的帮助。

这是 rails 来源的资产 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"

通常当我将 React 与 Rails 一起使用时,我会遵循这种模式:

在我的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。

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

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

//= require react-modal-bootstrap

可用组件为:

<ReactModalBoostrap.Modal />

对于您正在使用的模式,它应该是一样的,所以您应该使用 <ReactModal.Modal />

而不是 <Modal />

还记得在 运行 bundle install

之后重新启动服务器