当前位置: 首页 > 知识库问答 >
问题:

对输入onChange事件使用Lodash debounce和React useCallback

宁鹏程
2023-03-14

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

我引用这些线程:

在React.js中执行去盎司

使用取消公告的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);
  };

错误:

错误:处理程序不是一个函数

当用户在输入字段中键入时,如何对500mssetSerachQuery()进行去抖动?

共有1个答案

甄云
2023-03-14

您案例中的问题是,您没有将函数传递给debounce,而是直接调用它。你可以使用箭头函数在去盎司像

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

完整代码

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);
  };
 类似资料:
  • 问题内容: 如何监听基于控件的更改事件? http://jsfiddle.net/NV/kb3gN/1621/ 问题答案: 编辑: 请参阅SebastienLorber的答案,该答案修复了我的实现中的错误。 编辑06/2016:我刚刚遇到了一个新问题,当浏览器尝试“重新格式化”刚刚给他的html时,会导致组件始终重新呈现,这会出现一个新问题。看到 编辑07/2016:这是我的生产实现。它有一些您可

  • 问题内容: 我正在用Mocha和Enzyme测试反应成分。这是组件(为简化起见,已简化): 这是测试: 我期望当用户在框中键入文本时,将调用该方法。上面的测试失败了: 我究竟做错了什么? 我应该澄清一下,我的目标是测试该方法是否被调用。我怎样才能做到这一点? 问题答案: 您可以直接通过原型直接监视该方法。 另外,您可以在实例的方法上使用间谍,但是您必须进行强制更新,因为在调用mount之后该组件已

  • 问题内容: 显然一个被禁用的没有被任何事件处理 有没有解决此问题的方法? 在这里,我需要单击输入以启用它。但是,如果我不激活它,则不应发布输入。 问题答案: 禁用的元素不会触发鼠标事件。大多数浏览器会将事件从禁用元素传播到DOM树,因此事件处理程序可以放在容器元素上。但是,Firefox不会表现出这种行为,当您单击禁用的元素时,它根本不执行任何操作。 我想不到更好的解决方案,但是,为了完全兼容跨浏

  • 问题内容: 在我的react和typescript应用程序中,我使用:。 我如何正确定义类的类型,这样我就不必用来绕过类型系统了? 如果我把我得到: 问题答案: 通常,事件处理程序应使用,例如: 您可以在这里阅读原因(还原“使SyntheticEvent.target通用,而不是SyntheticEvent.currentTarget。”)。 UPD:如@ roger-gusmao所述,它更适合于

  • 问题内容: 该事件不起作用。 问题答案: 更改事件是在元素而不是元素上触发的。但是,这不是唯一的问题。您定义函数的方式不会导致组件的重新渲染。似乎您可能尚未完全了解React的概念,所以“在React中思考”可能会有所帮助。 您必须将所选值存储为状态,并在值更改时更新状态。更新状态将触发组件的重新呈现。 另请注意,元素没有属性。反应/ JSX简单地复制了著名的HTML语法,它不引入自定义属性(有例

  • 问题内容: 我正在使用事件委托来侦听DOM中较低级的事件,但不适用于选择框上的onchange事件。onchange事件会传播还是冒充DOM? 谷歌搜索未能找到结论性的答案。 问题答案: 根据规范,,,应该气泡和和不应该泡沫。 此行为是正确实现在所有web浏览器除了IE <9,即,,,做适当气泡在IE> = 9。