我想知道如何处理这两种布局。
首先,我有一个 css 网格布局,可用于 1024px 或更大的分辨率,并且它们支持当前的网格标准。
非常标准的布局,带有标题、侧边栏和主要区域。
.container {
display: grid;
grid-template-columns: 0.30fr 0.70fr;
grid-template-rows: auto;
grid-template-areas: "header header" "sidebar main";
}
.header {
grid-area: header;
background-color: yellow;
}
.sidebar {
grid-area: sidebar;
background-color: lightblue;
}
.main {
grid-area: main;
background-color: green;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div class="container">
<div class="header">
header
</div>
<div class="sidebar">
side
</div>
<div class="main">
main
</div>
</div>
</body>
</html>
现在,如果浏览器不支持网格或者它们低于 1024px,那么它们会转到移动布局。
该布局将由 Flex 制作,并成为标题和主区域的布局,侧边栏被隐藏,仅通过用户交互显示。
我只是想不出一种令我满意的反应方式。
我的问题是,我可以使用媒体选择器隐藏侧边菜单,然后单击汉堡菜单切换显示,但我不知道这是否感觉像 ReactJS 的方式,因为我宁愿不渲染侧边栏隐藏它。
我还必须有一些东西来处理调整大小的窗口。
如果你真的只想以reactjs的方式做到这一点,你可以使用生命周期方法来做到这一点,例如componentWillMount
, componentDidMount
and componentWillUnmount
随着resize
事件和文档的宽度。
在这个例子中我没有做太多 CSS 部分的工作,但是你会明白的。
在全页视图中运行此脚本后尝试调整窗口大小。
class MyLayout extends React.Component {
constructor() {
super();
this.state = {
mobileView: false,
showSidebar: true
};
this.updateViewState = this.updateViewState.bind(this);
this.toggleSideBar = this.toggleSideBar.bind(this);
}
updateViewState() {
if (!this.state.mobileView && document.documentElement.clientWidth < 1024) {
this.setState({
mobileView: true,
showSidebar: false
});
} else if (document.documentElement.clientWidth > 1024) {
this.setState({
mobileView: false,
showSidebar: true
});
}
}
toggleSideBar() {
this.setState({
showSidebar: !this.state.showSidebar
});
}
componentWillMount() {
this.updateViewState();
}
componentDidMount() {
window.addEventListener("resize", this.updateViewState);
}
componentWillUnmount() {
window.removeEventListener("resize", this.updateViewState);
}
render() {
let containerClass = 'container';
if (this.state.mobileView) containerClass = containerClass + ' mobileview';
return (
<div className = { containerClass }>
<div className="header"> {this.state.mobileView && <button onClick={this.toggleSideBar} />} header
</div>
{
this.state.showSidebar &&
<div className = "sidebar" >
side
</div>
}
<div className="main">
main
</div>
</div>);
}
}
ReactDOM.render(
<MyLayout /> ,
document.getElementById('container')
);
.container {
display: grid;
grid-template-columns: 0.30fr 0.70fr;
grid-template-rows: auto;
grid-template-areas: "header header" "sidebar main";
}
.mobileview {
grid-template-columns: 0fr 1fr;
}
.mobileview.sidebar {
float: left;
}
.header {
grid-area: header;
background-color: yellow;
}
.sidebar {
grid-area: sidebar;
background-color: lightblue;
}
.main {
grid-area: main;
background-color: green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your component. -->
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)