页面布局
我们来看一下项目的每个页面的布局
Home
Edit
Display
Login
其中Home, Display, Edit都是下面这样的布局
而Login的布局是

所以我们抽离出布局组件,Home,Edit,Display三者的布局抽离为BasicLayout,而Login的布局抽离为LoginLayout组件,注意到他们的Heder都是相同的,所以我们把Header抽离为一个公共的组件。
Header
在src下新建components目录,在其中新建Header文件夹,在其中新建index.jsx和index.module.css。index.jsx的内容如下
import React from 'react'import styles from './index.module.css'function Header(props) {const toEdit = (e) => {e.preventDefault()}const toHome = (e) => {e.preventDefault()}return (<div className={styles.header}><div className={styles.nav}><ul><li><a href="/home" onClick={toHome}>首页</a></li><li><a href="/edit" onClick={toEdit}>写博客</a></li></ul></div><div className={styles.desc}>Coder</div></div>)}export default Header
index.module.css中的内容为
.nav {width: 100%;height: 100px;position: relative;}.nav ul {position: absolute;top: 0;right: 0;padding: 0;margin: 0;}.nav ul li {list-style: none;float: left;width: 80px;height: 30px;line-height: 30px;text-align: center;padding-top: 5px;}.nav ul li a {text-decoration: none;color: white;font-family: Consolas, "楷体";}.nav ul li:hover {border-bottom: 1px solid #FFF;box-shadow: 0 0 10px #FFF inset;}.desc {width: 100%;height: 100px;font-size: 40px;line-height: 100px;color: white;font-family: Consolas, "楷体";}
上面的内容想必还是很容易理解的,其中Header中的两个a标签的点击事件均没有处理,这两个a标签是用于做路由跳转用的,等用到在回过头来补充。
BasicLayout
在src下新建layouts文件夹,在其中新建文件夹BasicLayout,在BasicLayout中新建index.jsx和index.module.css,其中index.jsx的内容为
import React from 'react'import styles from './index.module.css'import Header from './../../components/Header'function BasicLayout(props) {const { children } = props;return (<div className={styles.box}><div className={styles.container}><Header /><div className={styles.main}><div className={styles.content}>{children}</div><div className={styles.aside}></div></div></div></div>)}export default BasicLayout
其中index.module.css中的内容为
.box {width: 100%;background: #d8e2eb url(./../../assets/img/bg.jpg) no-repeat top center;min-height: 100vh;}.container {max-width: 1200px;margin: 0 auto;padding: 0 50px;}.main {display: flex;}.content {flex: 3;margin-right: 20px;}.aside {flex: 1;}
这里要用到背景图片,我们在src下新建assets文件夹,然后新建img,在其中放入背景图片,背景图片在这里
接在src下新建common.css,以消除内外边距,设置字体
* {margin: 0;padding: 0;}div {font-family: Consolas, "楷体";box-sizing: border-box;}
现在我们在src/index.js中引用该布局看看效果
import React from 'react';import ReactDOM from 'react-dom';import RichText from './pages/RichText';import BasicLayout from './layouts/BasicLayout'import './common.css'ReactDOM.render(<BasicLayout><RichText /></BasicLayout>,document.getElementById("root"));
LoginLayout
在layouts下新建LoginLayout文件夹,在LoginLayout中新建index.jsx和index.module.css。有了BasicLayout的经验,代码的内容不必解释,直接上代码。index.jsx
import React from 'react'import styles from './index.module.css'import Header from './../../components/Header'function LoginLayout(props) {const { children } = props;return (<div className={styles.box}><div className={styles.container}><Header /><div className={styles.main}>{children}</div></div></div>)}export default LoginLayout
index.module.css
.box {width: 100%;background: #d8e2eb url(./../../assets/img/bg.jpg) no-repeat top center;min-height: 100vh;}.container {max-width: 1200px;margin: 0 auto;padding: 0 50px;}.main {width : 300px;margin: 0 auto;}
