【问题标题】:how to pass the the object values to the select tag with onChange event?如何使用 onChange 事件将对象值传递给 select 标签?
【发布时间】:2018-08-01 23:47:47
【问题描述】:

我有这个反应代码,它抓取用户输入的文本的一部分,并创建 JSON 对象作为选择标签的选项。这里 textContent 来自具有用户输入的 fileReader,而 handleChange 与表相关。我收到此错误:

TypeError: _this6.state.textContent.match 不是函数

当我 console.log JSON.stringify(this.state.textContent.match(/[A-Z]+:[0-9]{1,3}/gm)) 我得到这个对象 ["A:100","B:300","C:400","D:900","E:800"] 这是正确的,但我不能将它作为选项传递。谁能帮忙?

class AllForm extends Component {
  constructor(props) {
    super(props);
    this.state = {
      textContent: ""
    };
  }

  handleChanges = idx => e => {
    const { name, value } = e.target;
    const rows = [...this.state.rows];
    rows[idx] = {
      [name]: value
    };
  };

  render() {
    return (
      <Select
        name={"BIN"}
        placeholder={"choose the value"}
        options={JSON.stringify(
          this.state.textContent.match(/[A-Z]+:[0-9]{1,3}/gm)
        )}
        controlFunc={this.handleChanges(idx)}
      />
    );
  }
}

选择组件是:

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

const Select = props => (
  <div className="form-group">
    <select
      name={props.name}
      value={props.selectedOption}
      onChange={props.controlFunc}
      className="form-select"
    >
      <option value="">{props.placeholder}</option>
      {props.options.map(opt => {
        return (
          <option key={opt} value={opt}>
            {opt}
          </option>
        );
      })}
    </select>
  </div>
);

Select.propTypes = {
  title: PropTypes.string.isRequired,
  name: PropTypes.string.isRequired,
  options: PropTypes.array.isRequired,
  selectedOption: PropTypes.string,
  controlFunc: PropTypes.func.isRequired,
  placeholder: PropTypes.string
};

export default Select;

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    我不确定这就是你想要的(缺乏正则表达式的知识),但这里是工作代码。唯一的问题是这里的JSON.stringify。你从你的.match得到一个数组,你为什么用JSON.stringify

    class AllForm extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          textContent: "A:100B:300C:400D:900E:800",
        };
      }
    
      handleChanges = idx => e => {
        const { name, value } = e.target;
        const rows = [...this.state.rows];
        rows[idx] = {
          [name]: value
        };
      };
    
      render() {
        return (
          <Select
            name={"BIN"}
            placeholder={"choose the value"}
            options={
              this.state.textContent.match(/[A-Z]+:[0-9]{1,3}/gm)
            }
            //controlFunc={this.handleChanges(idx)}
          />
        );
      }
    }
    
    const Select = props => (
      <div className="form-group">
        <select
          name={props.name}
          value={props.selectedOption}
          onChange={props.controlFunc}
          className="form-select"
        >
          <option value="">{props.placeholder}</option>
          {props.options && props.options.map(opt => {
            return (
              <option key={opt} value={opt}>
                {opt}
              </option>
            );
          })}
        </select>
      </div>
    );
    
    ReactDOM.render(<AllForm />, document.getElementById("root"));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="root"></div>

    【讨论】:

    • 我觉得我解释得不好。对象值来自用户输入,因此它不是预定义的。选择应该根据用户输入更改的选项。但是您对 JSON stringfy 是正确的,我可以将其删除。不过还是一样的错误。
    • 对不起,我不能很好地理解你的问题。您在第一句话中提到了这一点,但由于您的代码中没有输入,我无法弄清楚。你能提供你从哪里以及如何获得这些输入的吗?用户输入什么样的文本等?
    • 用户选择并导入一个文本文件,然后正则表达式将这个文本文件的一部分作为我们的对象。我想我需要设置一个值并使用 onchange 事件更新状态以传递它。
    • 我不知道您如何导入此文件并获取值然后更新状态,但match is not a function 表示当您尝试.match 时您的textContent 不是字符串。
    • 这是一个很长的代码,所以我没有把它全部放在这里。而且我已经导入并获得了正确的文件,只是无法弄清楚其余的。 :)
    猜你喜欢
    • 2011-03-29
    • 2015-03-07
    • 2013-03-08
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2019-06-06
    相关资源
    最近更新 更多