Как вы могли бы подойти к этому, это извлечь все данные массива, отправив избыточное действие getNamesArray
, а затем использовать функции фильтра и отображения в компоненте:
componentDidMount() {
this.props.getNamesArray();
}
render(){
const { namesArray } = this.props; // from redux mapStateToProps
let namesArrayItems;
if (namesArrayItems.length > 0) {
namesArrayItems = namesArray
.filter(name => {
// remove names that do not match current filter text
return name.toLowerCase().indexOf(this.state.name.toLowerCase()) >= 0
})
.map(name=> (
<NameItem key={name._id} name={name} />
));
} else {
namesArrayItems = <h4>No Names found...</h4>;
}
return (
{namesArrayItems}
);
}
Затем используйте ввод текстового поля, который передается выше как this.state.name
, используя обработчик onChange для получения ввода пользователя:
onChange(e) {
this.setState({ [e.target.name]: e.target.value });
}
А в поле возврата поставить и текстовое поле с обработчиком onChange:
<input
type="text"
name="name"
value={this.state.name}
placeholder="Filter Names"
onChange={this.onChange.bind(this)}
/>
Работает довольно эффективно для меня. Недостатком этого подхода является то, что вы сначала извлекаете все данные массива, поэтому загрузка занимает больше времени, однако приложению не нужно извлекать данные при каждом вводе пользователем, что делает взаимодействие с пользователем более плавным.