开发者问题收集

onChange 函数在带有 react-rails 的 erb 中的 react 组件中不起作用

2020-09-17
589

我正在使用带有 react-rails gem 的 rails 5.1.7,在我的一个 erb 视图中有一个 react 组件,其中有 react_component() 助手,我正在尝试使 onChange 事件工作,但是该函数没有以任何方式响应。我应该能够看到控制台日志,但我没有看到它。

import React from "react"
import PropTypes from "prop-types"


class CardList extends React.Component {

  constructor(props) {
    super(props);
    
    this.state = {
      all_cards: this.props.all_cards,
      orderBy: 'all',
    };

    this.handleChange = this.handleChange.bind(this);

  }

  handleChange(event) {
    console.log('change was made');
  }

  render () {

    const allData = this.state.all_cards.map((card, index) => (
          <div className="col-md-12">
            { card.category }
         </div>
    ));

    return (
      <React.Fragment>

        <label for="order">Order</label>

        <select onChange={this.handleChange} name="order" id="order_filter">
          <option value="element1">element1</option>
          <option value="element2">element2</option>
        </select>

        {allData}

      </React.Fragment>
    );
  }
}

CardList.propTypes = {
  all_cards: PropTypes.array
};

export default CardList

在我看来,该组件被称为:

<%= react_component("cardlist", { all_cards: @all_cards }, {prerender: true}) %>

如果我尝试将以下内容添加到 serverRendering.js 文件中:

ReactRailsUJS.mountComponents()

我在组件应该挂载的页面中收到此错误:

ExecJS::ProgramError in Cards#index
ReferenceError: document is not defined

我也尝试过用 <div> 标签替换 React.Fragment 或更改 handleChange 中的状态>

2个回答

这可能是组件安装到 .erb 的方式存在问题。我创建了一个 repo 来演示如何在项目中正确设置 react-rails 。要处理搜索/过滤功能,请查看此 提交

简而言之,

  1. 确保将组件的正确名称传递到 react_components 。在我的例子中,我将 App 作为主要组件传递。请参阅 此处
  2. 确保所有组件都自动导出。在本例中,使用 react_ujs ,如 此处 所示。我的组件文件夹名称是 components ,这就是我使用 const componentRequireContext = require.context('components', true);
Harrison Kamau
2020-09-21

在元素上尝试使用 onInput 而不是 onChange 标签,这可能会按您想要的方式工作。

Adarsh
2020-09-17