将 Lodash debounce 与 React useCallback 用于输入 onChange 事件

Car*_*ein 7 javascript lodash reactjs react-hooks

onChange当用户在输入字段中键入内容时,我试图消除事件的反跳。

我正在引用这些线程:

我有以下代码片段,我尝试复制上面线程中提供的解决方案:

const handler = useCallback(debounce(setSearchQuery(value), 500), []);

useEffect(() => {
  document.addEventListener('keydown', handleDocumentKeyDown);
  handler(value);
  return () => document.removeEventListener('keydown', handleDocumentKeyDown);
}, [isOpen, handleDocumentKeyDown, handler, value]);

// ...

const handleChange = (event) => {
  setValue(event.target.value);
};
Run Code Online (Sandbox Code Playgroud)

错误:

未捕获的类型错误:处理程序不是函数

当用户在输入字段中键入内容时,setSerachQuery()如何消除反跳?500ms

Shu*_*tri 4

您的情况的问题是,您不是传递函数进行反跳,而是直接调用它。您可以在去抖动中使用箭头函数,例如

const handler = useCallback(debounce(() => setSearchQuery(value), 500), []);
Run Code Online (Sandbox Code Playgroud)

完整代码

const handler = useCallback(debounce(() => setSearchQuery(value), 500), []); // arrow function here

  useEffect(() => {
    document.addEventListener('keydown', handleDocumentKeyDown);
    handler(value);
    return () => document.removeEventListener('keydown', handleDocumentKeyDown);
  }, [isOpen, handleDocumentKeyDown, handler, value]);

  ...

  const handleChange = (event) => {
    setValue(event.target.value);
  };
Run Code Online (Sandbox Code Playgroud)

  • 这给了我 lint 错误“React Hook useCallback 收到了一个依赖项未知的函数。改为传递内联函数。eslintreact-hooks/exhaustive-deps` (15认同)
  • 你不能假设该功能不会改变,而且如果你在团队中工作,禁用 eslint 警告也是一种不好的做法,因为你不希望新手开发人员复制这种做法,在遇到困难时绕过 eslint 警告。所以,我建议,花尽可能多的时间来解决问题 (4认同)
  • 您可以将 setSearchQuery 作为 useCallback 的依赖项传递,但由于该函数不会更改,因此您也可以禁用 eslint 警告。检查[这篇文章了解更多详细信息](/sf/ask/3908820611/#55854902) (2认同)