如何在反应选择中使用另一个反应选择的值制作过滤器

时间:2019-06-19 13:45:05

标签: reactjs react-select

我正在使用react-select创建一个解决方案,一个选择应该只包含另一个不包含的选项。例如

import React from 'react'
import Select from 'react-select'

const list = [
  { label: 'foo', value: 1 },
  { label: 'bar', value: 2 },
  { label: 'bin', value: 3 },
]

export default Test extends React.Component {
  render = () => (
    <>
      <Select ref="a" options={list} />
      <Select ref="b" options={list} filterOption={o => /* devo omitir "a" */} />
    </>
  )
}

要让<Select ref="b" />被另一个<Select ref="a" />的值过滤掉,该怎么办?

2 个答案:

答案 0 :(得分:1)

在编写自定义filterOption函数时,上面来自Laura的答案打破了过滤条件(如果您不希望Select成为可过滤对象,那可能就可以了)。

一个更简单的解决方案是在您通过的options上应用一个简单的过滤器,而不是第二个Select。

const options = [
  { label: "foo", value: 1 },
  { label: "bar", value: 2 },
  { label: "bin", value: 3 }
];

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      value1: false,
      value2: false
    };
  }

  onChange = option => {
    if (this.state.value2.value === option.value) {
      this.setState({
        value1: option,
        value2: false
      });
    } else {
      this.setState({ value1: option });
    }
  };

  onChange2 = option => {
    this.setState({ value2: option });
  };
  render() {
    return (
      <div className="App">
        <Select
          onChange={this.onChange}
          options={options}
          value={this.state.value1}
        />
        <Select
          onChange={this.onChange2}
          options={options.filter(
            option => option.value !== this.state.value1.value
          )}
          value={this.state.value2}
        />
      </div>
    );
  }
}

Working Example

答案 1 :(得分:0)

要实现您的目标,您需要将选择的值存储在状态中,以便将其与filterOption中的选项进行比较,例如以下示例:

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      value1: false,
      value2: false
    };
  }

  filterOption = option => {
    return this.state.value1 !== option.data;
  };

  onChange = option => {
    this.setState({ value1: option });
  };

  onChange2 = option => {
    this.setState({ value2: option });
  };
  render() {
    return (
      <div className="App">
        <Select
          onChange={this.onChange}
          options={options}
          value={this.state.value1}
        />
        <Select
          filterOption={this.filterOption}
          onChange={this.onChange2}
          options={options}
          value={this.state.value2}
        />
      </div>
    );
  }
}

这里是live example