【问题标题】:React use debounce with setStateReact 使用 debounce 和 setState
【发布时间】:2020-07-02 11:32:42
【问题描述】:

背景

假设我们都知道lodash 中的debounce 函数。

如果用户快速输入1,12,123,1234,它允许我们在一定的延迟时间后只使用1234进行一次警报。

这很习惯于减少请求量,用于优化。


说明

对于一个普通的输入框,我们可以使用那种debounce,它可以工作。

问题:一旦我们在与debounce 相同的回调中添加setStatedebounce 将无法正常工作。

有人知道原因吗?

import React, { useState } from "react";
import "./styles.css";
import { debounce } from "lodash";

export default function App() {
  const [input, setInput] = useState("");

  const debouceRequest = debounce(value => {
    alert(`request: ${value}`);
  }, 1000);
  const onChange = e => {
    setInput(e.target.value); // Remove this line will lead to normal debounce
    debouceRequest(e.target.value);
  };

  return (
    <div className="App">
      <input onChange={onChange} />
    </div>
  );
}

【问题讨论】:

    标签: javascript reactjs lodash debounce


    【解决方案1】:

    试试这个(使用 useCallback):

    import React, { useState, useCallback } from "react";
    import "./styles.css";
    import { debounce } from "lodash";
    
    const request = debounce(value => {
      alert(`request: ${value}`);
    }, 1000);
    
    export default function App() {
      const [input, setInput] = useState("");
    
      const debouceRequest = useCallback(value => request(value), []);
    
      const onChange = e => {
        debouceRequest(e.target.value);
        setInput(e.target.value); // Remove this line will lead to normal denounce
      };
    
      return (
        <div className="App">
          <input onChange={onChange} />
        </div>
      );
    }
    

    【讨论】:

    猜你喜欢
    • 2018-02-16
    • 2019-11-07
    • 1970-01-01
    • 2019-09-10
    • 2020-09-05
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多