react-autosuggest 与 debounce 和 distinctUntilChanged

Posted

技术标签:

【中文标题】react-autosuggest 与 debounce 和 distinctUntilChanged【英文标题】:react-autosuggest with debounce and distinctUntilChanged 【发布时间】:2019-11-07 21:33:14 【问题描述】:

意图:

我正在尝试实现一个理想的搜索字段,直到:

    已达到 350ms 的去抖时间 AND 直到输入字段的值发生变化。

到目前为止我已经尝试过:

我使用主题来跟踪输入字段中的更改。每次输入字段发生变化并调用 handleSuggestionsFetchRequested 时,我都会使用 searchString$.next(userInput); 将新值向下推到 @​​987654323@

useEffect 钩子中,我是pipeing 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 调用仍会继续。

问题:

我认为问题在于每次输入字段的值发生变化时,我也在设置状态:

const handleChange = (
  event: React.ChangeEvent<>,
   newValue : Autosuggest.ChangeEvent
) => 
  setUserInput(newValue);
;

这导致组件重新渲染并调用 useEffect,最终导致一次又一次地调用 API。

我可能错了。

如何复制:

我创建了一个 Sample Code Sandbox 来复制问题。

非常感谢。

【问题讨论】:

【参考方案1】:

感谢 yurzui 在我的 tweet 上的 cmets,我能够找出问题的原因。

我在每次对帐时都创建了一个新的Subject

const searchString$: Subject<string> = new Subject<string>();

就在我的组件函数中。

我把它移了出来,它就像一个魅力。

注意:正如 yurzui 所建议的,不要忘记在 ajax 调用中捕获错误,否则 Subject 将会死掉。

我已经更新了代码沙箱示例,以防万一有人需要参考它。

【讨论】:

以上是关于react-autosuggest 与 debounce 和 distinctUntilChanged的主要内容,如果未能解决你的问题,请参考以下文章

React 组件自动绑定

自动建议 renderInputComponent - 属性“onChange”的 inputProps 类型不兼容

像在 IDE 中一样在文本区域中反应自动完成(例如 VS Code、Atom)

LDAP 与 MYSQL .. JA-SIG CAS 与 LDAP 与 CAS 与 MySQL

python网络编程基础(线程与进程并行与并发同步与异步)

=与==&与&&| 与 || 的区别