Вот мой вариант использования, простой компонент React с вводом текста, который фильтрует элементы списка:
const myArray = [...];
// Inside React component:
handleChangeEvent = ({target: {value}}) => this.setState({value});
render() {
return (
<div>
<input onChange = {this.handleChangeEvent} value = {this.state.value} />
<ul>
{myArray.filter(v => v.includes(this.state.value)).map(v => <li>{v}</li>)}
</ul>
</div>
);
}
С помощью этого кода каждый раз, когда я меняю текст внутри ввода, элементы внутри списка немедленно меняются.
Чего я хочу добиться: пользователь вводит текст фильтра, этот текст немедленно обновляется при вводе текста (обычно), но я хочу, чтобы элементы внутри списка нет обновлялись немедленно, но скажем, через 500 мс после того, как пользователь закончил вводить текст.
Итак, в основном:
<input>, элементы списка неРедактировать:
Что я пробовал:
import throttle from 'lodash/throttle';
const myArray = [...];
// Inside React component:
handleChangeEvent = ({target: {value}}) => this.setState({value});
calculateMatches = throttle(() => {
const matches = myArray.filter(v => v.includes(this.state.value))
return matches;
}, 500);
render() {
return (
<div>
<input onChange = {this.handleChangeEvent} value = {this.state.value} />
<ul>
{this.calculateMatches().map(v => <li>{v}</li>)}
</ul>
</div>
);
}
Но это дросселируется каждые 500 мс, поэтому, если пользователь продолжит печатать в течение 1600 мс, он обновит список 3 раза.
Не могли бы вы использовать lodash?
Вы можете использовать debounce из lodash именно для этой цели.
@zzzzBov Добавлено. Oblosys и SrTHompson См. Комментарий под моим редактированием, почему я не использовал бы throttle / debounce напрямую.
@SrThompson Мой плохой, debounce работает отлично.
Ознакомьтесь с этой статьей, чтобы получить хорошее описание этих двух: css-tricks.com/debouncing-throttling-explained-examples



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Пожалуйста, покажите минимальный воспроизводимый пример того, что вы пробовали при попытке решить эту проблему.