【发布时间】:2018-05-22 18:53:42
【问题描述】:
我使用带有 React 的 Next.js 创建了一个网站,并且非常喜欢声明一个 js 变量来定义组件样式,如下所示:
const foo = {
fontSize: '12px',
};
在渲染方法中我这样做:
render() {
return (
<div style={foo}>bar</div>
);
}
使用 ESLint,我可以快速找到未使用的样式/变量(如果没有引用)并保持代码整洁。因此我不像这样使用<style> 或styled-jsx:
render() {
return (
<div>
<style>
.foo {
font-size: '12px';
}
</style>
<div className="foo">bar</div>
</div>
);
}
问题
仅使用 js 变量而不是 <style> 的问题是我无法将媒体查询应用于不同的屏幕尺寸,所以我想我可以使用 javascript 解决这个问题:
render() {
// Bigger font size for smaller devices
if (windowWidth < 768) foo.fontSize = '24px';
return (
<div style={foo}>bar</div>
);
}
我通过这个解决方法得到windowWidth:Get viewport/window height in ReactJS。只要渲染发生在客户端上,这就会很好地工作。这种方法的问题在于 Next.js 将首先在服务器端呈现视图。在这个时刻,窗口/屏幕大小是未知的,因此windowWidth = 0。因此,我认为客户端在从服务器接收到初始渲染的页面后必须重新渲染。
问题:
如何强制客户端在服务器初始渲染后立即重新渲染以确定
windowWidth的值?这是一个好的做法/解决方案,还是会导致性能问题或元素闪烁?
【问题讨论】:
-
您是否考虑过在您的顶级组件中使用
forceUpdate?但是,我认为您会遇到 2.) 中列出的两个问题。取决于您编写样式的方式...如果它是移动优先的,它们会闪烁,并且可能会在桌面上触发布局重绘,反之亦然,桌面优先。跨度> -
您可以尝试在页面上隐藏响应元素并仅在更新后显示。
-
你使用过componentWillMount生命周期吗??它应该工作
标签: css reactjs responsive-design media-queries next.js