React 和 HTML Select 组件到 return String 而不是 Integer 的最佳方式

Best way for a React and HTML Select-component to return String instead of Integer

我有一个 React-class (JSX),其中包含以下(此处略有简化)代码:

var Select = React.createClass({
  onChange: function (ev) {
     console.log(ev.target.value);
  },
  render: function() {
     var optionsHtml = this.state.options.map(function (el) {
                    console.log(this.props.getValue(el);
                    return (
                        <option key={this.props.getValue(el)}
                                value={this.props.getValue(el)}> { this.props.getLabel(el) } 
                        </option>
                    )
                });
    return <select onChange={this.onChange}>
     {optionsHtml}
    </html>
}

在渲染函数中,console.log returns 值的整数(即 1、2、3)在初始化 Options-HTML 和设置值时,但是在当实际的 Select-box 值发生变化时,onChange-method 值是一个字符串(即“1”、“2”、“3”)。

解决此问题的一种方法是在 onChange 中使用之前检查值并将其转换为 Number,但是还有其他方法吗?

编辑:

选项数组看起来像这样

var options = [
  { id: 1, name: "Test" },
  { id: 2, name: "Test2" },
  { id: 3, name: "Test3" }
]

然后可以使用 getValue 和 getLabel 函数调用组件,如下所示:

<Select options={options}, 
   getValue: function(v) {
      return v.id;
   },
   getLabel: function(v) {
      return v.name;
   }/>

一旦我生成要发送到后端的 JSON,不同类型就是一个问题,我需要在某个时候进行转换。

当您的 onChange 函数执行并尝试读取选项标签的 value 时,重要的是要记住 all 属性将被读取为字符串。

话虽如此,请注意

onChange: function (ev) {
   console.log(ev.target.value);
   //          ^^^^^^^^^^^^^^^ always string
}

因此,每次您想在 onChange 函数中处理一个值时,都必须将该值转换为一个数字。这样的事情应该可以解决问题:

onChange: function (ev) {
   var valueInt = parseInt(en.target.value, 10);
   console.log(valueInt);
}

或者如果该值不一定是数字,您可以尝试将其解析为数字(如果适用):

onChange: function (ev) {
   var valueInt;
   try{
       valueInt = parseInt(en.target.value, 10);
   }catch(e){ 
        // handle value not being a number if unexpected
   }
   console.log(valueInt);
}

我会将渲染方法和事件侦听器更改为:

onChange(event) {
  const el = this.state.options[event.target.value];
  const value = this.props.getValue(el);
},

render() {
  const options = this.state.options.map((el, idx) => (
    <option key={this.props.getValue(el)} value={idx}>{ this.props.getLabel(e) }</option>
  ));

  return (
    <select onChange={this.onChange}>
      { options }
    </select>
  )
}

这样做,您并没有获得实际价值。你在告诉 "Pick object at index N from within predefined objects and get it's value."