如何使用 React hook 检测 Next.js SSR 中的窗口大小?

2024-03-02

我正在使用 Next.js 构建一个应用程序反应日期 https://github.com/airbnb/react-dates.

我有两个组件日期范围选择器组件和DayPickerRangeController成分。

我想渲染日期范围选择器当窗口的宽度大于尺寸 1180px 时,如果尺寸小于此我要渲染DayPickerRangeController反而。

这是代码:

      windowSize > 1180 ?
           <DateRangePicker
             startDatePlaceholderText="Start"
             startDate={startDate}
             startDateId="startDate"
             onDatesChange={handleOnDateChange}
             endDate={endDate}
             endDateId="endDate"
             focusedInput={focus}
             transitionDuration={0}
             onFocusChange={(focusedInput) => {
               if (!focusedInput) {
                 setFocus("startDate")
               } else {
                 setFocus(focusedInput)
                }
               }}
                /> :
             <DayPickerRangeController
               isOutsideRange={day => isInclusivelyBeforeDay(day, moment().add(-1, 'days'))}
               startDate={startDate}
               onDatesChange={handleOnDateChange}
               endDate={endDate}
               focusedInput={focus}
               onFocusChange={(focusedInput) => {
               if (!focusedInput) {
                 setFocus("startDate")
                 } else {
                  setFocus(focusedInput)
                 }
               }}
              /> 
          }

我通常使用带有窗口对象的反应钩子来检测窗口屏幕宽度,例如this https://usehooks.com/useWindowSize/

但我发现这种方式在ssr时不可用,因为ssr渲染没有window对象。

无论 ssr 如何,是否有其他方法可以安全地获取窗口大小?


您可以通过添加以下代码来避免在 ssr 中调用检测函数:

// make sure your function is being called in client side only
if (typeof window !== 'undefined') {
  // detect window screen width function
}

您的链接中的完整示例:

import { useState, useEffect } from 'react';

// Usage
function App() {
  const size = useWindowSize();

  return (
    <div>
      {size.width}px / {size.height}px
    </div>
  );
}

// Hook
function useWindowSize() {
  // Initialize state with undefined width/height so server and client renders match
  // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/
  const [windowSize, setWindowSize] = useState({
    width: undefined,
    height: undefined,
  });

  useEffect(() => {
    // only execute all the code below in client side
    // Handler to call on window resize
    function handleResize() {
      // Set window width/height to state
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    }
    
    // Add event listener
    window.addEventListener("resize", handleResize);
     
    // Call handler right away so state gets updated with initial window size
    handleResize();
    
    // Remove event listener on cleanup
    return () => window.removeEventListener("resize", handleResize);
  }, []); // Empty array ensures that effect is only run on mount
  return windowSize;
}

注意:更新为 Sergey Dubovik 评论,我们不需要验证窗口,因为 useEffect 在客户端运行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 React hook 检测 Next.js SSR 中的窗口大小? 的相关文章

随机推荐

  • 在 Android 模拟器上安装 Facebook apk

    有没有人成功做到这一点 我已经尝试过这个网站上的 sdk apk 的各种组合 但没有成功 https developers facebook com docs android downloads https developers faceb
  • Zend / Apache2:多次请求 url 时出现 302 Found

    我正在编程一个REST API with Zend框架 当多次调用 url 时 例如每秒 1 个请求 1000 次 大约0 2 的案例而不是得到200 OK作为我得到的回应302 Found 所以重定向到不同的页面 这是整个服务器响应 30
  • 最近执行的 SQL 不在 V$SQL 中

    什么情况下选择查询不会出现在V SQL视图中 例如 如果我运行这个 select findme from T 然后立即运行 select from v sql where sql text like findme 在什么情况下我不会返回任何
  • 如何在WebGL中实现类似隧道的动画? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何在WebGL中实现类似隧道的动画
  • 如何将多个 csv 文件导入 MySQL 数据库

    有没有办法同时将多个csv文件导入MySQL数据库 某种批量导入 我在 Mac OSX 上运行 MAMP 服务器 我有 185 个 csv 文件需要导入到 MySQL 表中 我可以使用 phpMyAdmin 的导入选项卡单独导入它们 但这需
  • 隐藏评级栏的阴影

    定制RatingBar显示我的影子 如何隐藏这个阴影
  • jQuery 选择器

    我试图从源代码中获取这一点 即 a href img src wwv flow file mgr get file p security group id 1343380920146312332 p flow id 222 p fname
  • Postgres SQL 状态:22P02

    我需要在 Postgres 中运行以下查询 select left file date 10 as date lob name devicesegment sum conversion units numeric as units from
  • 水晶报表子报表分页符

    我是水晶报表新手 我一直在尝试解决这个子报表分页问题 我想我知道该报告的作用 但我不知道如何解决这个问题 很难解释 所以我上传了这些图片 My main report My sub report which is in the Detail
  • 在 int 上使用扩展方法

    我正在阅读有关扩展方法的内容 并尝试使用它们 看看它们是如何工作的 我尝试了这个 namespace clunk public static class oog public static int doubleMe this int x r
  • 在 Heroku 环境中使用 ResourceUtils.getFile 从类路径读取文件

    我正在 Heroku 中运行 Spring Boot 应用程序 使用 Maven 来管理构建生命周期 在应用程序的初始化阶段 我想读取打包到 JAR 文件中的文件 为了设法获取文件的内容 我正在使用 Spring 实用程序类Resource
  • UILongPressGestureRecognizer 不工作

    我想检测UILongPressGestureRecognizer为了UIWebView点击并按住 这样当我长按近3秒时 就会出现以下内容if条件应该是True那么只有 if navigationType UIWebViewNavigatio
  • 如何阻止会话

    当导航到 Facebook 社交网络时 我发现我可以打开 2 个帐户 1 个在 Firefox 中 另一个在 Internet Explorer 中 或者可能是多个帐户 这不太好 因为 Facebook 政策只允许同时打开一个会话 启动会话
  • 将 Devexpress GridControl 动态添加到 C# Windows 应用程序

    我想动态添加 Devexpress GridControl 在运行时我想显示过滤器行 另外 我希望在具有动态创建的 GridControl 的同一窗体上有一个按钮 单击该按钮时 它应该显示网格控件的过滤器对话框弹出窗口 提供的示例可以满足您
  • 读取 bash 中具有默认值的变量

    我需要在 bash 脚本中从终端读取一个值 我希望能够提供用户可以更改的默认值 Please enter your name Ricardo 在此脚本中 提示是 请输入您的姓名 默认值为 Ricardo 光标将位于默认值之后 有没有办法在
  • 使用 Ghostscript 作为 x11 查看器(gs x11 视口定位)?

    我已经知道了Ghostscript 前端 http en wikipedia org wiki Ghostscript Front ends观众 但我想知道如何gs本身可以用来查看PDF文档吗 我能得到的最接近的是明确指定x11窗口作为输出
  • 当有匹配时,使用 MERGE 后如何获取标识值?

    假设我有一个带有身份字段的表 如果记录尚不存在 我想在其中插入一条记录 在下面的示例中 我检查存储在 Field1 中的值是否已存在于表中 如果没有 我插入一条新记录 表的定义 MyTable MyTableId int Identity
  • 解码字符串中的“=C3=A4”

    我尝试了很多不同的方法来正确显示我的字符串 但我无法使其工作 这就是字符串 f C3 A4hrt German word f hrt 我的文件以 utf 8 编码 该文件在 Joomla 中加载 我都尝试过 geschichte gt in
  • Elastic BeanStalk EC2 实例的日志耗尽了整个磁盘空间

    我有一个 Elastic BeanStalk 环境 在 1 个 EC2 实例上运行我的应用程序 当我最初配置环境时 我添加了负载均衡器 但从那时起我将其设置为仅使用 1 个实例 在容器内运行的应用程序显然会产生大量日志 几天后它们会耗尽整个
  • 如何使用 React hook 检测 Next.js SSR 中的窗口大小?

    我正在使用 Next js 构建一个应用程序反应日期 https github com airbnb react dates 我有两个组件日期范围选择器组件和DayPickerRangeController成分 我想渲染日期范围选择器当窗口