React useOnWindowResize Hook

ReactReactBeginner
立即练习

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

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

简介

在本实验中,我们将学习如何创建一个名为 useOnWindowResize 的自定义 React Hook,它会在窗口大小改变时执行一个回调函数。我们将使用 useRef()useEffect() Hook 来监听 Window 全局对象的 'resize' 事件,并在组件卸载时进行清理。这个 Hook 对于创建需要适应不同屏幕尺寸的响应式 Web 应用程序很有用。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL react(("React")) -.-> react/FundamentalsGroup(["Fundamentals"]) react(("React")) -.-> react/AdvancedConceptsGroup(["Advanced Concepts"]) react/FundamentalsGroup -.-> react/jsx("JSX") react/AdvancedConceptsGroup -.-> react/hooks("React Hooks") subgraph Lab Skills react/jsx -.-> lab-38400{{"React useOnWindowResize Hook"}} react/hooks -.-> lab-38400{{"React useOnWindowResize Hook"}} end

React useOnWindowResize Hook

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

这段代码会在每次窗口大小改变时执行一个回调函数。要实现它,你应遵循以下步骤:

  1. 使用 useRef() Hook 创建一个名为 listener 的变量。这个变量将存储监听器的引用。

  2. 使用 useEffect() Hook 和 EventTarget.addEventListener() 来监听 Window 全局对象的 'resize' 事件。当事件触发时,调用 callback 函数。

  3. 在组件卸载时,通过 EventTarget.removeEventListener() 移除任何现有的监听器来进行清理。

以下是代码:

const useOnWindowResize = (callback) => {
  const listener = React.useRef(null);

  React.useEffect(() => {
    if (listener.current) {
      window.removeEventListener("resize", listener.current);
    }
    listener.current = callback;
    window.addEventListener("resize", callback);
    return () => {
      window.removeEventListener("resize", callback);
    };
  }, [callback]);
};

const App = () => {
  useOnWindowResize(() =>
    console.log(`Window size: (${window.innerWidth}, ${window.innerHeight})`)
  );
  return <p>Resize the window and check the console.</p>;
};

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

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

总结

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