【发布时间】:2021-02-07 21:09:32
【问题描述】:
(注意警告:我对 React/GraphQL 不是很熟悉,所以请放轻松)。
我正在使用 Gatsby 构建博客,我的导航栏会根据屏幕大小更改其外观。在我的导航栏中间是博客的标志。现在,当读者在桌面上查看页面时,我希望显示完整的徽标(包括文本)。当他们在移动设备上查看时,我只希望呈现实际徽标(不包括文本)(我有一张带有完整徽标的图像和一张带有缩短徽标的图像)。
到目前为止,我的方法是 1. 创建两个单独的 SiteNavLogo-components 和 2. 使用以下代码块检查当前窗口大小(我删除了所有与此问题无关的代码并替换它使用“...”)和 3. 有条件地渲染两个徽标组件之一:
class SiteNav extends React.Component {
...
};
render(): JSX.Element {
changeLogo = window.matchMedia('(max-width: 600px)').matches;
return (
<>
...
{changeLogo && (
<SiteNavLogoMobile />) || !changeLogo &&
<SiteNavLogo/>}
</>
);
}
}
这适用于gatsby develop,但对于gatsby build 则失败,因为“窗口”不可用。在this 的文章中找到了使用componentDidMount 的推荐,所以我尝试了这个:
class SiteNav extends React.Component {
changeLogo = false;
componentDidMount(): void {
this.changeLogo = window.matchMedia('(max-width: 600px)').matches;
}
};
render(): JSX.Element {
return (
<>
...
{this.changeLogo && (
<SiteNavLogoMobile />) || !this.changeLogo &&
<SiteNavLogo/>}
</>
);
}
}
这样做的问题是,第一个渲染周期是在 componentDidMount 执行之前执行的,这意味着页面将始终使用 changeLogo=false 进行渲染。
我怎样才能使移动用户查看页面时呈现缩短的徽标? (为此我什至需要两个组件还是可以只更改我的 GraphQL 查询?) 非常感谢任何建议。
【问题讨论】:
标签: html css reactjs graphql gatsby