【问题标题】:React Select set wrong value反应选择设置错误的值
【发布时间】:2018-10-15 20:01:19
【问题描述】:

我快被这个弄疯了。我在我的应用程序中使用react-select,因为我的表单很大,所以我创建了一个小组件来像这样包装 Selects:

const SelectField = (props) => {
  const { id } = props;
  return (
    <Select
      id={id}
      value={this.state[id]}
      onChange={(value) => { this.onChangeValue({ target: { id, value } }); }}
      options={options[id]}
      placeholder="Please select..."
    />
  );
};

我是这样使用它的:

<SelectField id="gender" />

onChangeValue 方法处理所有输入的setState

onChangeValue(e) {
  const { id, value } = e.target;
  this.setState({ [id]: value });
}

由于某些奇怪的原因 react-select 没有返回 event 我只是模拟它传递我需要的数据。

这个版本的代码似乎可以按预期工作,如果我选择了一些东西,我可以在输入中正确地看到正确的值。不幸的是,在该值不正确的状态下,它应该是string,但它是整个选项:{ label: 'Gender', value: 'Male'}

所以这里我已经不明白react-select如果value的结果是这个对象,怎么能显示Male

如果我像下面这样更改onChange

onChange={(value) => { this.onChangeValue({ target: { id, value: value.value } }); }}

这对我来说更有意义,因为我直接将正确的值传递给要在状态中设置的值。

突然间,这根本不起作用。如果我选择一个选项,输入仍会显示占位符,但是,是的,状态是正确的。

我尝试添加几个解决方法,但没有一个按预期工作。

我需要将所选值显示给选择,并且还需要将状态(在我的示例中为性别)作为带有值的字符串,而不是整个对象...

我在这里做错了什么?想法?干杯

【问题讨论】:

  • 您似乎将 SelectField 声明为无状态组件,然后在其中调用 .setState ,这是行不通的。
  • 你能举个例子吗,谢谢!
  • 当你将一个 React 组件声明为一个函数时(这里:const SelectField = (props) =&gt; ...)你将它声明为 stateless,这意味着你没有 this.state,实际上是因为这是一个箭头功能,您甚至根本没有this。我会推荐你​​参考 react 文档来了解这一点。声明组件的另一种方法是作为类class SelectField extends React.Component { ...,您可以访问this.setState

标签: javascript reactjs react-select


【解决方案1】:

这是我之前评论中更详细的答案:

class SelectField extends React.Component {

    state = {
        id: this.props.id
    };

    onChangeValue = id => value {
        this.setState({ [id]: value });
    }

    render() {
        const { id } = this.state;
        return (
            <Select
                id={id}
                value={this.state[id]}
                onChange={this.onChangeValue(id)}
                options={options[id]} // unsure where options came from.
                placeholder="Please select..."
            />
        );
    }
}

【讨论】:

  • 好的,这对我来说很有意义...但是我不知道如何获取主要组件中的值...因为状态值存储在单独的组件中... . 我很确定我错过了什么......
  • 设法让它与回调一起工作,它就像一个魅力。谢谢!
【解决方案2】:

不幸的是 react-select 想要整个对象作为选定的值。你基本上有两个选择:

  1. 以当前状态存储整个对象。您可以将值返回给任何其他相关方。
  2. 只存储状态中的值。当您将值传递给 react-select 时,您需要查找您的选项

    value={options[id].find(opt => opt.value === this.state[id].value)}

此外,没有理由将其存储在 state[id] 中。您可以将其存储为 state.value 或 selectedValue,因为它是该组件的唯一状态。

【讨论】:

  • 您能否通过示例增强您的答案,以便我更好地理解?感谢您的帮助
  • 老实说,我会像您现在一样继续存储整个选项。您是否有不想存储整个内容的原因?
  • 当我保存它时,我无法传递整个状态,但我必须检查所有选择并获取值...
  • 你的包装器在任何给定点只有一个状态。您的调用者也需要传递一个 onChange 处理程序。您可以使用该对象的值调用它,并在内部保持整个对象的状态。例如this.props.onChange(this.state[id].value)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2021-09-27
  • 2019-10-13
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多