如何使用另一个 react-select 的值在 react-select 中制作过滤器
How to make a filter in react-select using the value of another react-select
我正在使用 react-select
创建一个解决方案,并且 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" />
的值过滤?
为了实现您的目标,您需要将 select 值存储在状态中,以便将其与 filterOption
中的选项进行比较,如下例所示:
class App extends Component {
constructor(props) {
super(props);
this.state = {
value1: false,
value2: false
};
}
filterOption = ({ label, value, data }, string) => {
if (this.state.value1 === data) {
return false;
} else if (string) {
return label.includes(string) || value.toString().includes(string);
} else {
return true;
}
};
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.
Laura 的上述回答在您编写自定义 filterOption 函数时破坏了过滤(如果您不希望 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>
);
}
}
我正在使用 react-select
创建一个解决方案,并且 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" />
的值过滤?
为了实现您的目标,您需要将 select 值存储在状态中,以便将其与 filterOption
中的选项进行比较,如下例所示:
class App extends Component {
constructor(props) {
super(props);
this.state = {
value1: false,
value2: false
};
}
filterOption = ({ label, value, data }, string) => {
if (this.state.value1 === data) {
return false;
} else if (string) {
return label.includes(string) || value.toString().includes(string);
} else {
return true;
}
};
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.
Laura 的上述回答在您编写自定义 filterOption 函数时破坏了过滤(如果您不希望 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>
);
}
}