Gatsby:基于 window.innerWidth 行为不当做出反应条件渲染

2024-02-02

组件的条件渲染基于window.innerWidth似乎没有按预期工作生产建立基于盖茨比的网站。

我用来检查视口宽度的钩子,以及对窗口全局的额外检查以避免 Gatsby-node 生产构建错误,如下所示:

import { useState, useEffect } from 'react'

const useWindowWidth = () => {
  const windowGlobal = typeof window !== 'undefined'

  if(windowGlobal) {
    const [width, setWidth] = useState(window.innerWidth)

    useEffect(() => {
      const handleResize = () => setWidth(window.innerWidth)
      window.addEventListener('resize', handleResize)
      return () => {
        window.removeEventListener('resize', handleResize)
      }
    })

    return width
  }
}

export default useWindowWidth

然后在我的实际组件中我执行以下操作:

IndexPage.Booking = () => {
  const windowWidth = useWindowWidth()

  return (
    <div className="section__booking__wrapper">
      { windowWidth <= mediaQueries.lg && <IndexPage.Cta /> }
      <div className="section__booking-bg" style={{ backgroundImage: `url(${bg})` }}>
        { windowWidth > mediaQueries.lg && <IndexPage.Cta /> }
      </div>
    </div>
  )
}

它按应有的方式工作development但是生产构建无法呈现:

<div className="section__booking-bg" style={{ backgroundImage: `url(${bg})` }}>

当调整 mediaQueries.lg (1024) 下面的窗口大小时,它会触发实际的正常行为或有条件地渲染组件的移动和桌面版本。

仔细检查是否是因为渲染仅在resize事件(它不会,因为它在加载时起作用development环境)我也干脆,从内钩console.log()返回值并被打印出来,在生产正确加载。

中也没有错误或警告生产 or development建造任何东西。

根据@Phillip的建议进行编辑

const useWindowWidth = () => {
  const isBrowser = typeof window !== 'undefined'
  const [width, setWidth] = useState(isBrowser ? window.innerWidth : 0)

  useEffect(() => {
    if (!isBrowser) return false

    const handleResize = () => setWidth(window.innerWidth)
    window.addEventListener('resize', handleResize)

    return () => {
      window.removeEventListener('resize', handleResize)
    }
  })

  return width
}

现在,只要您在 mediaQueries.lg 阈值下调整大小一次,它就可以工作,然后它可以在桌面和移动设备上完美工作,但不能在加载时工作。


我遇到了与此类似的问题,但尚未找到解决方案,但有解决方法。将以下内容放在渲染的开始处:

if (typeof window === `undefined`) {
    return(<></>);
}

我认为正在发生的事情是 Gatsby 正在使用基于窗口宽度的样式(将为 0 / 未定义)构建页面。然后,一旦页面加载,它就不会更新 DOM 中的样式,因为它认为它已经执行了该操作。我认为这可能是盖茨比的一个小错误?

无论哪种方式,上面的内容都会在构建过程中将您的组件呈现为空白,迫使其在页面加载时完全尊重所有逻辑。希望这提供了一个解决方案,尽管不是一个令人满意/完整的解释:)

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

Gatsby:基于 window.innerWidth 行为不当做出反应条件渲染 的相关文章

随机推荐