React useSSR 钩子

ReactReactBeginner
立即练习

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

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

简介

在本实验中,我们将探索在 React 中使用 useSSR 钩子。这个钩子使我们能够检查代码是在浏览器还是服务器上运行,并提供有关环境的其他信息,例如工作线程的可用性、事件监听器和视口。完成本实验后,你将更好地理解如何编写针对不同环境进行优化的 React 代码。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL react(("React")) -.-> react/StateManagementGroup(["State Management"]) react(("React")) -.-> react/PerformanceOptimizationGroup(["Performance Optimization"]) react(("React")) -.-> react/FundamentalsGroup(["Fundamentals"]) react(("React")) -.-> react/AdvancedConceptsGroup(["Advanced Concepts"]) react/FundamentalsGroup -.-> react/jsx("JSX") react/FundamentalsGroup -.-> react/conditional_render("Conditional Rendering") react/AdvancedConceptsGroup -.-> react/hooks("React Hooks") react/StateManagementGroup -.-> react/use_state_reducer("Using useState and useReducer") react/PerformanceOptimizationGroup -.-> react/memoization("Memoization with useMemo") subgraph Lab Skills react/jsx -.-> lab-38410{{"React useSSR 钩子"}} react/conditional_render -.-> lab-38410{{"React useSSR 钩子"}} react/hooks -.-> lab-38410{{"React useSSR 钩子"}} react/use_state_reducer -.-> lab-38410{{"React useSSR 钩子"}} react/memoization -.-> lab-38410{{"React useSSR 钩子"}} end

React useSSR 钩子

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

要检查代码是在浏览器还是服务器上运行,创建一个自定义钩子,它使用 typeofWindowWindow.documentDocument.createElement() 来确定 DOM 是否可用。使用 useState() 钩子定义 inBrowser 状态变量,并使用 useEffect() 钩子来更新它并在最后进行清理。使用 useMemo() 钩子来记忆自定义钩子的返回值。

以下是代码:

const isDOMavailable = !!(
  typeof window !== "undefined" &&
  window.document &&
  window.document.createElement
);

const useSSR = () => {
  const [inBrowser, setInBrowser] = React.useState(isDOMavailable);

  React.useEffect(() => {
    setInBrowser(isDOMavailable);
    return () => {
      setInBrowser(false);
    };
  }, []);

  const useSSRObject = React.useMemo(
    () => ({
      isBrowser: inBrowser,
      isServer: !inBrowser,
      canUseWorkers: typeof Worker !== "undefined",
      canUseEventListeners: inBrowser && !!window.addEventListener,
      canUseViewport: inBrowser && !!window.screen
    }),
    [inBrowser]
  );

  return useSSRObject;
};

const SSRChecker = (props) => {
  const { isBrowser, isServer } = useSSR();

  return <p>{isBrowser ? "在浏览器上运行" : "在服务器上运行"}</p>;
};

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

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

总结

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