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

React handle autocomplete等待一段时间加载动态数据[重复]

屠泰平
2023-03-14

我有一个自动完成组件,默认情况下,它没有数据显示。当用户键入某个内容时,它将动态加载数据。但我希望在用户停止键入时执行此操作,而不是每次都快速输入内容。所以我等待1500毫秒,然后检查字符串是否已更改。但是代码没有按照我预期的方式工作。

const dispatch = useDispatch();
const [searchStr, setSearchStr] = useState(null);

function handleChange(event) {
    const str = event.target.value.toLowerCase();

    if (str.length < 2) return;

    setSearchStr(str);

    setTimeout(() => {
      // str never equals searchStr
      console.log(str, searchStr)
      if(str === searchStr) {
         dispatch(doSearch(searchStr));
      }
    }, 1500);
}

共有1个答案

邢博涛
2023-03-14

代码中有两个问题。

1-setState异步运行的,因此setSearchStr不会立即更改searchStr

2每次输入更改时,都会创建一个新的setTimeout,因此在从第一个字符输入开始的1500ms之后,它将失去其效果。你要做的事情叫做去平衡。解决方案是在创建一个新的之前清除之前的setTimeouts:

let timer; // =========> HERE

function MyComponent() {
  const dispatch = useDispatch();
  const [searchStr, setSearchStr] = useState(null);

  function handleChange(event) {
    const str = event.target.value.toLowerCase();

    if (str.length < 2) return;

    setSearchStr(str);

    clearTimeout(timer); // =========> HERE

    timer = setTimeout(() => {
       dispatch(doSearch(str));
    }, 1500);
  }
}

如果您坚持将搜索值保存在有状态变量中,您可以使用use效应:

let timer; // =========> HERE

function MyComponent() {
  const dispatch = useDispatch();
  const [searchStr, setSearchStr] = useState(null);

  function handleChange(event) {
    const str = event.target.value.toLowerCase();

    setSearchStr(str);
  }

  useEffect(() => {
    if (searchStr.length < 2) return;

    clearTimeout(timer);

    timer = setTimeout(() => {
       dispatch(doSearch(searchStr));
    }, 1500);
  }, [searchStr])
}
 类似资料:
  • 我最近用python和Selenium做了一个webscraper,我发现做起来非常简单。页面使用ajax调用加载数据,最初我等待一个固定的time_out加载页面。有一段时间奏效了。之后,我发现selenium有一个内置函数WebDriverWait,它可以使用wait.until()等待特定元素的加载。这使我的webscraper运行得更快。 问题是,我对结果还是不满意。我下载内容平均每页花了

  • 我试图在新选项卡中打开站点,代码:

  • 我正在尝试使用selenium/python从印度中央污染控制委员会读取数据表。这是一个输出示例。我基本上遵循此处介绍的方法:https://github.com/RachitKamdar/Python-Scraper. 多亏了@Prophet,我才能够从第一页读取数据(使用Python的XPATH选择元素?)但我无法让selenium在切换到第2页时等待数据表重新加载。我试图添加webdrive

  • 我试图创建一个等待加载页面的方法,但我出现了一个错误。可能我没有正确使用这个方法。 错误是:

  • 问题内容: 我正在构建一个访问angular / python RESTful API的Angular前端。 我正在使用AngularJS v1.2.16。 出于某种原因,在加载REST资源之前需要花费大量的时间,而大多数时间只是在等待。据我了解,“等待”正在衡量到第一个字节的时间- 我的所有服务都在本地运行(前端,API和数据库)。 鉴于所有服务都在本地运行,我不知如何调试它。有人在哪里找什么提

  • 由于我正在使用的网站的随机加载时间,我必须等待某些html元素出现才能使用它们。我利用了时间。用于测试目的的sleep命令,但现在要优化所有内容。我尝试过各种来自网络的明确的等待建议,但它们在某个点上都发生了冲突。 下面是一个代码示例: 提前谢谢各位!