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

IT技术 ruby-on-rails reactjs react-rails rails-assets
2021-05-13 04:18:21

我有一个在前端使用 react 的 rails 应用程序,但是我无法将其他 react module添加到我的组件中。我正在使用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"
2个回答

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

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

//= require react-modal-bootstrap

可用的组件将是:

<ReactModalBoostrap.Modal />

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

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

通常,当我将 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。