javascript - React Hooks + Media Query 页面刷新问题
问题描述
我创建了一个响应式侧边栏,逻辑实现如下,当屏幕低于 765 像素时,侧边栏自动隐藏,但问题是当我刷新低于 765 像素的页面时,侧边栏显示如下
我的代码看起来像这样
function SideBar(props) {
const {someValue} = useContext(SideBarContext);
const {SideBarValue, SideBarWallpaperValue} = React.useContext(CounterContext);
const [SideBarThemeValue] = SideBarValue;
const [SideBarBackgroundValue] = SideBarWallpaperValue;
const [sideBarOpen, setSideBarOpen] = useState(true);
const [SideBarButtonContainer, setSideBarButtonContainer] = useState(false);
useEffect(() => {
window.addEventListener("resize", resize);
})
const resize = () => {
if(window.innerWidth < 765) {
setSideBarOpen(false)
setSideBarButtonContainer(true)
} else {
setSideBarOpen(true)
setSideBarButtonContainer(false)
}
}
const showSideBar = () => {
setSideBarOpen(!sideBarOpen)
}
return (
<>
{
SideBarButtonContainer ? <div className={"showSideBarButtonContainer"}>
<img className={"showSideBarButton"} onClick={() => showSideBar()} src={SideBarMenuIcon} alt={"Open"} />
</div> : null
}
<Menu isOpen={sideBarOpen}>
</Menu>
</>
);
}
我假设当我刷新页面时,该sideBarOpen
值变为 true,尽管我在 resize 方法中进行了检查,并注意到当我开始缩小屏幕时,侧边栏消失了,看起来像这样
解决方案
侧边栏的默认状态是打开,但是您必须根据宽度计算初始状态。此外,您必须仅在初始渲染时调整窗口大小时初始化侦听器。
const [sideBarOpen, setSideBarOpen] = useState(() => window.innerWidth > 765);
const [SideBarButtonContainer, setSideBarButtonContainer] = useState(() => window.innerWidth < 765);
useEffect(() => {
window.addEventListener("resize", resize);
}, []); // Only initialize listener on initial render
const resize = () => {
if(window.innerWidth < 765) {
setSideBarOpen(false)
setSideBarButtonContainer(true)
} else {
setSideBarOpen(true)
setSideBarButtonContainer(false)
}
}
推荐阅读
- css - Bootstrap.4 - 使用 Slick 构建轮播
- google-sheets - 表格 - 如何检查一个范围内是否存在多个特定单词
- javascript - LocalStorage 和 SessionStorage 不起作用 React.js
- reactjs - 获取 NextJs 中任何组件的响应式道具
- python - 在 PyTorch 中 SSD 的损失没有减少
- python - Click (), send Keys () 功能不适用于 find element by x path 选项
- laravel - 如何为 axios 设置 URL?
- python - 'list' 对象没有属性 'id'
- java - 您如何在代理后面使用 spring-security OAuth2,但仅将 ForwardedHeaderTransformer 用于 OAuth 组件
- java - Java JButton 两个或多个图标