Я не могу понять логику функции обратного вызова в приведенном ниже коде.
В его нынешнем виде список фильтруется по мере того, как пользователь вводит значение в поле ввода. Я не могу понять, как потом вернуть список, если фильтр будет удален.
https://codepen.io/benszucs/pen/BPqMwL?editors=0010
class Application extends React.Component {
state = {
options: ['Apple', 'Banana', 'Pear', 'Mango', 'Melon', 'Kiwi']
}
handleFilter = (newFilter) => {
if (newFilter !== "") {
this.setState(() => ({
options: this.state.options.filter(option => option.toLowerCase().includes(newFilter.toLowerCase()))
}));
}
};
render() {
return (
<div>
<Filter handleFilter = {this.handleFilter} />
{this.state.options.map((option) => <p>{option}</p>)}
</div>
);
};
}
const Filter = (props) => (
<div>
<input name = "filter" onChange = {(e) => {
props.handleFilter(e.target.value);
}}/>
</div>
);
ReactDOM.render(<Application />, document.getElementById('app'));





Поскольку вы перезаписываете исходное значение состояния, вы не сможете его отменить. Я бы рекомендовал создать новое состояние под названием filter и обновить его значение в onChangeHandler(). А в методе render() вы должны отфильтровать результаты перед их отображением.
Пример:
// the state
this.state = {
users: ['abc','pdsa', 'eccs', 'koi'],
filter: '',
}
// the change handler
onChangeHandler(e) {
this.setState({
filter: e.target.value,
});
}
// displaying the results
const list = this.state.users.filter(u => u.includes(this.state.filter)).map(u => (
<li>{u}</li>
));
@BenSzucs, не могли бы вы отметить это как ответ на вопрос о помощи другим людям, а также @peetya?
В вашем фильтре дескриптора вы можете установить состояние по умолчанию
handleFilter = (newFilter) => {
if (newFilter !== "") {
this.setState(() => ({
options: this.state.options.filter(option => option.toLowerCase().includes(newFilter.toLowerCase()))
}));
} else {
this.setState(() => ({
options: ['Apple', 'Banana', 'Pear', 'Mango', 'Melon', 'Kiwi']
}));
}
Приятно слышать :) Не забудьте отметить мой ответ как решение, если все работает хорошо ^^ '