React useDebounce 钩子

ReactReactBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习如何创建一个名为 useDebounce 的自定义 React 钩子,它有助于防抖用户输入。防抖是一种技术,它会延迟函数的调用,直到自上次调用以来已经过了一定的时间。这种技术通常用于用户输入触发应用程序状态频繁更新的场景,因为它有助于减少不必要的重新渲染并提高性能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL react(("React")) -.-> react/AdvancedConceptsGroup(["Advanced Concepts"]) react(("React")) -.-> react/StateManagementGroup(["State Management"]) react(("React")) -.-> react/FundamentalsGroup(["Fundamentals"]) react/FundamentalsGroup -.-> react/jsx("JSX") react/FundamentalsGroup -.-> react/event_handling("Handling Events") react/AdvancedConceptsGroup -.-> react/hooks("React Hooks") react/StateManagementGroup -.-> react/use_state_reducer("Using useState and useReducer") subgraph Lab Skills react/jsx -.-> lab-38378{{"React useDebounce 钩子"}} react/event_handling -.-> lab-38378{{"React useDebounce 钩子"}} react/hooks -.-> lab-38378{{"React useDebounce 钩子"}} react/use_state_reducer -.-> lab-38378{{"React useDebounce 钩子"}} end

React useDebounce 钩子

虚拟机中已经提供了 index.htmlscript.js。一般来说,你只需要在 script.jsstyle.css 中添加代码。

要对给定值进行防抖处理,你可以创建一个自定义钩子,它接受一个 value 和一个 delay。使用 useState() 钩子来存储防抖后的值,并使用 useEffect() 钩子在每次 value 更新时更新防抖后的值。为了将前一个状态变量的设置器调用延迟 delay 毫秒,使用 setTimeout()。为了在组件卸载时进行清理,使用 clearTimeout()。这在处理用户输入时特别有用。

以下是 useDebounce() 钩子的一个示例实现:

const useDebounce = (value, delay) => {
  const [debouncedValue, setDebouncedValue] = React.useState(value);

  React.useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);

    return () => {
      clearTimeout(handler);
    };
  }, [value, delay]);

  return debouncedValue;
};

你可以在组件中像这样使用 useDebounce() 钩子:

const Counter = () => {
  const [value, setValue] = React.useState(0);
  const lastValue = useDebounce(value, 500);

  return (
    <div>
      <p>
        当前值:{value} - 防抖后的值:{lastValue}
      </p>
      <button onClick={() => setValue(value + 1)}>增加</button>
    </div>
  );
};

ReactDOM.createRoot(document.getElementById("root")).render(<Counter />);

请点击右下角的“上线”以在端口 8080 上运行网络服务。然后,你可以刷新“Web 8080”标签页来预览网页。

总结

恭喜你!你已经完成了 React useDebounce 钩子实验。你可以在 LabEx 中练习更多实验来提升你的技能。