【发布时间】:2021-01-03 18:35:27
【问题描述】:
我需要根据屏幕大小有条件地渲染组件。
我使用 nextjs 和 getInitialProps 来获取数据,页面是服务器端渲染的。我想在客户端检测设备的屏幕大小,所以我实现了一个自定义的钩子来做到这一点。
使用WindowSize.js
import { useEffect, useState } from 'react';
export default function useWindowSize() {
const [windowSize, setWindowSize] = useState({
width: typeof window === 'undefined' ? 1200 : window.innerWidth, // default width 1200
});
useEffect(() => {
// Handler to call on window resize
function handleResize() {
// Set window width/height to state
setWindowSize({
width: window.innerWidth,
//height: window.innerHeight,
});
}
// Add event listener
window.addEventListener('resize', handleResize);
// Call handler right away so state gets updated with initial window size
handleResize();
// Remove event listener on cleanup
return () => window.removeEventListener('resize', handleResize);
}, []); // Empty array ensures that effect is only run on mount
return windowSize.width <= 600;
}
然后我使用这个钩子来检测窗口大小和条件渲染组件
export default function IndexPage() {
const isMobile = useWindowSize();
if (typeof window !== "undefined") {
// if you are running it on codesanbox, I don't know why log is not printed
console.log("client side re-render");
}
return (
<div>
{isMobile ? (
<div
style={{
color: "red",
fontSize: 40
}}
>
mobile
</div>
) : (
<div
style={{
color: "blue",
fontSize: 20
}}
>
desktop
</div>
)}
</div>
);
}
IndexPage.getInitialProps = () => {
return {
a: 1
};
};
当我在移动浏览器上加载页面时,你会看到
text mobile 应用了错误的 CSS 样式。视频演示:https://share.getcloudapp.com/nOuk08L0
如何重现: https://codesandbox.io/s/thirsty-khayyam-npqpt
谁能帮帮我。提前谢谢!
【问题讨论】: