【问题标题】:Execute function in React when user stops typing当用户停止输入时在 React 中执行函数
【发布时间】:2020-03-09 20:26:42
【问题描述】:

我想在使用停止输入(或按回车键)时执行一个功能(查询搜索服务) 我看到了一些使用 lodash Debounce 的例子

我正在玩 react hooks,想看看是否可以在没有任何外部库的情况下实现这一点。

import React, { useState } from 'react';
import Api from './Api'

const Search = (props) => {

    const [keyword, setKeyword] = useState();
    const [results, setResults] = useState([]);

    let timeout;

    const handleSearch = (event) => {

        setKeyword(event.target.value);

        if (timeout) {
            clearTimeout(timeout);
        }

        timeout = setTimeout(() => {
            timeout = null;

            if (keyword) {
                callSearchService()
            }
        }, 1000);
    }

    const callSearchService = () => {
        Api.search(keyword)
            .then(
                results => setResults(results),
                error => console.log(error)
            )
    }

    return (
        <input type="search" onKeyUp={(e) => handleSearch(e)} />
    )

}

执行被延迟了 1000 毫秒,但随后每个字符调用一次该函数(最后一个字符除外。这没有被执行,我尝试使用 onChange 而不是 onKeyUp,但同样的问题)。我可能把超时放在错误的地方。感谢您的无限智慧

【问题讨论】:

  • 我想知道你的超时变量是否被清除了,因为通过钩子更新状态会导致控件重新渲染并将超时变量再次设置为未定义。

标签: reactjs


【解决方案1】:

绝对!您可以使用useEffectuseState 实现自己的去抖动功能。在此示例中,value 是您的用户输入,setTimeout 回调中的代码仅在 value 1 秒后未更改时才会执行。

const [value, setValue] = useState("");

useEffect(() => {
  const callSearchService = () => {
    Api.search(value)
      .then(
        results => setResults(results),
        error => console.log(error)
      )
  }

  let debouncer = setTimeout(() => {
    callSearchService();
  }, 1000);
  return () => {
    clearTimeout(debouncer);
  }
}, [value]);

这里真正重要的是“清理”功能,如果value 发生变化,它会清除超时。如果 1 秒后实际上没有任何 value 更改,则 setTimeout 回调函数中的代码将实际执行。

【讨论】:

  • 好尼克。谢谢!我注意到的一件事是它会在安装组件时执行。我用 if (value != '') { // call service } 解决了,但该函数仍在执行中。附带问题我从来没有完全理解 [value] 作为 useEffect 的第二个参数,我应该在那里添加我想听的所有变量?谢谢!
  • 是的,那是你的依赖数组。只要其中一项更改,效果就会运行。
  • 我得到:React Hook useEffect 缺少依赖项:'callSearchService' 我尝试将其添加到依赖项数组中,但会引发另一个警告:(
  • 我建议在useEffect 挂钩中定义callSearchService 变量,否则您将遇到缺少依赖项错误无限循环。我会更新我的答案。
  • 收到了,再次感谢!幸运的是,我没有在其他任何地方使用该电话。 useEffect() 变大了!
猜你喜欢
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2019-11-03
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多