【发布时间】:2021-03-17 17:21:25
【问题描述】:
我是 gatsby 和服务器端渲染的新手,尽管我之前曾使用过很多 react。我编写了一些代码来检查窗口大小,然后根据宽度呈现导航或移动导航。但是,当我尝试测试部署时,我发现使用服务器端渲染时窗口对象不可用。我的问题是,有什么办法可以修改我的代码以使其仍然有效?还是我应该使用 sass 和媒体查询重建所有内容?
import React, { useState, useEffect } from "react"
import { Link, graphql, useStaticQuery } from "gatsby"
// import "./header.module.scss"
import HeaderStyles from "./header.module.scss"
import Logo from "../images/newlogo@2x.png"
import Nav from "./nav"
const Header = () => {
const data = useStaticQuery(graphql`
query MyQuery {
site {
siteMetadata {
title
}
}
}
`)
const [isDesktop, setDesktop] = useState(window.innerWidth > 768)
const updateMedia = () => {
setDesktop(window.innerWidth > 768)
}
useEffect(() => {
window.addEventListener("resize", updateMedia)
return () => window.removeEventListener("resize", updateMedia)
})
const [menuActive, setMenuState] = useState(false)
return (
<header
className={menuActive ? HeaderStyles.mobileNav : HeaderStyles.header}
>
<Link to="/" className={HeaderStyles.title}>
{/* {data.site.siteMetadata.title} */}
<img src={Logo} height="60" />
</Link>
{isDesktop ? (
<Nav />
) : (
//hamburger
<div
onClick={() => setMenuState(!menuActive)}
className={`${HeaderStyles.navIcon3} ${
menuActive ? HeaderStyles.open : ""
}`}
>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
)}
{menuActive ? <Nav /> : null}
</header>
)
}
export default Header
【问题讨论】:
标签: javascript reactjs gatsby server-side-rendering conditional-rendering