我正在尝试实现一个理想的搜索字段,该字段在进行以下操作之前不会进行任何API调用:
我已经使用主题来跟踪输入字段中的更改。每次输入字段发生变化并调用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$]);
但是,每当userInput发生更改时,API调用仍会继续进行。
我认为问题在于,每次输入字段的值更改时,我也会同时设置状态:
const handleChange = (
event: React.ChangeEvent<{}>,
{ newValue }: Autosuggest.ChangeEvent
) => {
setUserInput(newValue);
};
这导致组件重新呈现并调用useEffect,最终使API一次又一次地调用。
我可能是错的。
我已经创建了一个复制问题的Sample Code Sandbox。
非常感谢。