我使用Next.js和React创建了一个网站,并喜欢声明js变量来定义组件样式,例如:
在render方法中,我执行以下操作:
我通过这个解决方法获取
问题:
const foo = {
fontSize: '12px',
};
在render方法中,我执行以下操作:
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>
);
}
问题
只使用JavaScript变量而不使用<style>
的问题在于我无法应用媒体查询以针对不同屏幕尺寸进行调整,因此我想使用JavaScript来解决这个问题:
render() {
// Bigger font size for smaller devices
if (windowWidth < 768) foo.fontSize = '24px';
return (
<div style={foo}>bar</div>
);
}
我通过这个解决方法获取
windowWidth
: 在ReactJS中获取视口/窗口高度。只要渲染发生在客户端,这种方法就很有效。但是这种方法的问题是Next.js会先在服务器端渲染视图。此时,窗口/屏幕大小是未知的,因此windowWidth = 0
。因此,我认为客户端必须在接收到来自服务器的初始渲染页面后重新渲染。问题:
如何强制客户端在服务器进行初始渲染后立即重新渲染,以确定
windowWidth
的值?这是否是一个好的实践/解决方案,还是会导致性能问题或元素闪烁?
forceUpdate
吗?但是,我认为你会遇到你在2)中列出的两个问题,这取决于你如何编写样式...如果是移动优先,它们将闪烁,并且可能会触发桌面上的布局重绘,反之亦然。 - Teo Dragovic