反应处理自动完成等待一段时间以加载动态数据[重复]

Posted

技术标签:

【中文标题】反应处理自动完成等待一段时间以加载动态数据[重复]【英文标题】:React handle autocomplete waiting for some time to load dynamic data [duplicate] 【发布时间】:2021-06-11 03:31:28 【问题描述】:

我有一个自动完成组件,默认情况下它没有要显示的数据。当用户键入内容时,它将动态加载数据。但我希望在用户停止输入时完成此操作,而不是每次都快速输入内容。所以我等待 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】:

您的代码中有两个问题。

1- setState 是异步运行的,所以 setSearchStr 不会立即更改 searchStr 的值

2- 每次输入更改时,都会创建一个新的setTimeout,因此在第一个字符输入后 1500 毫秒后,它将失去效果。你要做的事情叫做debouncing。解决方法是在创建新的之前清除之前的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);
  

如果你坚持将搜索值保存在有状态变量中,可以使用useEffect:

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自动化篇-8-设置等待三种等待方法

java selenium (十三) 智能等待页面加载完成

如何快速使用异步函数?完成处理程序[重复]

等待函数完成处理程序完成失败

无法将数据从子功能组件传递到反应父组件(React.js)[重复]

使用动态确定的 slug 将路由反应到页面 [重复]