React useWindowSize 钩子

ReactReactBeginner
立即练习

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

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

简介

在本实验中,我们将学习如何在 React 中使用 useWindowSize 钩子来跟踪浏览器窗口的尺寸。这个钩子使我们能够创建响应式设计,并根据用户屏幕的大小调整组件的布局。在本实验结束时,你将更好地理解如何在 React 中使用钩子,以及如何创建更用户友好的应用程序。


Skills Graph

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

React useWindowSize 钩子

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

要跟踪浏览器窗口的尺寸,可以采取以下步骤:

  1. 使用 useState() 钩子初始化一个状态变量 windowSize,用于保存窗口尺寸。初始时将两个值都设为 undefined,以避免服务器端渲染和客户端渲染之间的不匹配。
const [windowSize, setWindowSize] = React.useState({
  width: undefined,
  height: undefined
});
  1. 创建一个函数 handleResize(),它使用 Window.innerWidthWindow.innerHeight 来更新状态变量。每当触发 'resize' 事件时,都会调用此函数。
const handleResize = () =>
  setWindowSize({ width: window.innerWidth, height: window.innerHeight });
  1. 使用 useEffect() 钩子在挂载时为 'resize' 事件设置适当的监听器,并在卸载时清理它。
React.useEffect(() => {
  window.addEventListener("resize", handleResize);

  handleResize();

  return () => {
    window.removeEventListener("resize", handleResize);
  };
}, []);

将上述内容整合起来,useWindowSize() 自定义钩子可以定义如下:

const useWindowSize = () => {
  const [windowSize, setWindowSize] = React.useState({
    width: undefined,
    height: undefined
  });

  const handleResize = () =>
    setWindowSize({ width: window.innerWidth, height: window.innerHeight });

  React.useEffect(() => {
    window.addEventListener("resize", handleResize);

    handleResize();

    return () => {
      window.removeEventListener("resize", handleResize);
    };
  }, []);

  return windowSize;
};

要使用 useWindowSize() 钩子,只需在组件中调用它,并从返回的对象中解构出 widthheight 值。

const MyApp = () => {
  const { width, height } = useWindowSize();

  return (
    <p>
      窗口尺寸:({width} x {height})
    </p>
  );
};

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

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

总结

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