Намерение:
Я пытаюсь создать идеальное поле поиска, которое не будет вызывать никаких вызовов API до тех пор, пока:
- Достигнуто время отката 350 мс
- И пока не произойдет изменение значения поля ввода.
То, что я пробовал до сих пор:
Я использовал тему, чтобы отслеживать изменения вполе ввода.Каждый раз, когда происходит изменение в поле ввода и вызывается handleSuggestionsFetchRequested
, я нажимаю новое значение вниз по Subject
, используя searchString$.next(userInput);
И в хуке useEffect
, я pipe
с searchString$
с debounceTime(350)
и distinctUntilChanged()
.Примерно так:
useEffect(() => {
searchString$
.pipe(
debounceTime(350),
distinctUntilChanged(),
switchMap(searchString =>
ajax(`https://api.github.com/search/users?q=${searchString}`)
),
map((networkResponse: any) => networkResponse.response.items)
)
.subscribe((suggestions: Array<User>) => setSuggestions(suggestions));
}, [searchString$]);
Но вызовы API продолжаются каждый раз, когда происходит изменение в userInput.
Проблема:
Я думаю, что проблема заключается в том, что каждыйКогда значение поля ввода изменяется, я также устанавливаю состояние:
const handleChange = (
event: React.ChangeEvent<{}>,
{ newValue }: Autosuggest.ChangeEvent
) => {
setUserInput(newValue);
};
Это вызывает повторную визуализацию компонента и вызывает useEffect, что в конечном итоге снова вызывает API иснова.
Я могу ошибаться.
Как копировать:
Я создал Образец песочницы Код , который повторяет проблему.
Заранее большое спасибо.