【问题标题】:How to update react state from react-select multi?如何从 react-select multi 更新反应状态?
【发布时间】:2019-03-08 20:15:04
【问题描述】:

我正在学习做出反应并尝试根据所选元素更新反应状态。我正在使用反应选择。它现在显示所有数据。但是当我从选择框中选择选项时,我想更新数据。如果我选择多个选项,那么它应该更新过滤所选选项的状态。

const reviews = [
  {
    "id": 1,
    "rating": 5,
    "label": [
      "Sports",
      "Sleep"
    ],
  },
  {
    "id": 3,
    "rating": 5,
    "label": [
      "Sports",
      "Pain"
    ],
  },
];
class SelectCreateFilter extends React.Component {
  state = {
    multi: null,
    data: reviews,
    health: healthBenefitsOptions,
    category: productCategoryOptions, 
    products: productOptions,
  };
  handleChange = name => value => {
    this.setState({
      [name]: value,
      data: this.state.data.filter() //how to perform the data mathcing to reviews.label
    });

  };
  render() {
    return (
      <div>
          <Select
            options={groupedOptions}
            components={components}
            value={multi}
            onChange={this.handleChange('multi')}
            placeholder="Select multiple tags or products for reviews"
            isMulti
            isSearchable
          />
      </div>
    );
  }
}

提前感谢您的帮助。 这是来自codesandbox的代码,以便您可以检查上面的代码 https://codesandbox.io/embed/jlro0vo4n3?fontsize=14

【问题讨论】:

  • 能否请您附上相关代码并具体说明问题所在?沙盒中的一个文件有 300 行长。
  • 谢谢尼克..在 app.js 中我设置了这样的状态 = { multi: null, data: reviews, health: healthBenefitsOptions, category: productCategoryOptions, products: productOptions }; handleChange = name => value => { this.setState({ [name]: value, data: }); };我想用 data.label 更新与所选选项匹配的 handlechange 事件的状态数据
  • 您能否在codesandbox 上设置一个可重现的问题示例?

标签: reactjs filter react-select react-state-management


【解决方案1】:

根据您的需要,您可以制定不同的过滤策略:

如果您想呈现标签中至少包含一个选定值的评论,您可以使用Array.some

  handleChange = name => values => {
    this.setState(state => ({
      [name]: values,
      data:
        values.length > 0  // if at least one value selected
          ? reviews.filter(review => // go through all reviews
              values.some(value => review.label.indexOf(value.label) >= 0) // and see if at least one selected value is in the label of that review
            )
          : reviews // if no value selected, show them all
    }));
  };

如果您想呈现必须包含所有选定值的评论,您可以使用Array.every

  handleChange = name => values => {
    this.setState(state => ({
      [name]: values,
      data:
        values.length > 0
          ? reviews.filter(review => 
              values.every(value => review.label.indexOf(value.label) >= 0) // check if every selected value is in a row
            )
          : reviews
    }));
  };

【讨论】:

  • 你做了我所期望的正确的事情。尽管我尚未对其进行测试,但我会将其标记为正确的解决方案。但逻辑很清楚。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多