页面布局

我们来看一下项目的每个页面的布局

Home
页面布局 - 图1
Edit
页面布局 - 图2
Display
页面布局 - 图3
Login
页面布局 - 图4
其中Home, Display, Edit都是下面这样的布局
页面布局 - 图5

而Login的布局是

页面布局 - 图6
所以我们抽离出布局组件,Home,Edit,Display三者的布局抽离为BasicLayout,而Login的布局抽离为LoginLayout组件,注意到他们的Heder都是相同的,所以我们把Header抽离为一个公共的组件。

Header

在src下新建components目录,在其中新建Header文件夹,在其中新建index.jsx和index.module.css。index.jsx的内容如下

  1. import React from 'react'
  2. import styles from './index.module.css'
  3. function Header(props) {
  4. const toEdit = (e) => {
  5. e.preventDefault()
  6. }
  7. const toHome = (e) => {
  8. e.preventDefault()
  9. }
  10. return (
  11. <div className={styles.header}>
  12. <div className={styles.nav}>
  13. <ul>
  14. <li><a href="/home" onClick={toHome}>首页</a></li>
  15. <li><a href="/edit" onClick={toEdit}>写博客</a></li>
  16. </ul>
  17. </div>
  18. <div className={styles.desc}>
  19. Coder
  20. </div>
  21. </div>
  22. )
  23. }
  24. export default Header

index.module.css中的内容为

  1. .nav {
  2. width: 100%;
  3. height: 100px;
  4. position: relative;
  5. }
  6. .nav ul {
  7. position: absolute;
  8. top: 0;
  9. right: 0;
  10. padding: 0;
  11. margin: 0;
  12. }
  13. .nav ul li {
  14. list-style: none;
  15. float: left;
  16. width: 80px;
  17. height: 30px;
  18. line-height: 30px;
  19. text-align: center;
  20. padding-top: 5px;
  21. }
  22. .nav ul li a {
  23. text-decoration: none;
  24. color: white;
  25. font-family: Consolas, "楷体";
  26. }
  27. .nav ul li:hover {
  28. border-bottom: 1px solid #FFF;
  29. box-shadow: 0 0 10px #FFF inset;
  30. }
  31. .desc {
  32. width: 100%;
  33. height: 100px;
  34. font-size: 40px;
  35. line-height: 100px;
  36. color: white;
  37. font-family: Consolas, "楷体";
  38. }

上面的内容想必还是很容易理解的,其中Header中的两个a标签的点击事件均没有处理,这两个a标签是用于做路由跳转用的,等用到在回过头来补充。

BasicLayout

在src下新建layouts文件夹,在其中新建文件夹BasicLayout,在BasicLayout中新建index.jsx和index.module.css,其中index.jsx的内容为

  1. import React from 'react'
  2. import styles from './index.module.css'
  3. import Header from './../../components/Header'
  4. function BasicLayout(props) {
  5. const { children } = props;
  6. return (
  7. <div className={styles.box}>
  8. <div className={styles.container}>
  9. <Header />
  10. <div className={styles.main}>
  11. <div className={styles.content}>
  12. {children}
  13. </div>
  14. <div className={styles.aside}>
  15. </div>
  16. </div>
  17. </div>
  18. </div>
  19. )
  20. }
  21. export default BasicLayout

其中index.module.css中的内容为

  1. .box {
  2. width: 100%;
  3. background: #d8e2eb url(./../../assets/img/bg.jpg) no-repeat top center;
  4. min-height: 100vh;
  5. }
  6. .container {
  7. max-width: 1200px;
  8. margin: 0 auto;
  9. padding: 0 50px;
  10. }
  11. .main {
  12. display: flex;
  13. }
  14. .content {
  15. flex: 3;
  16. margin-right: 20px;
  17. }
  18. .aside {
  19. flex: 1;
  20. }

这里要用到背景图片,我们在src下新建assets文件夹,然后新建img,在其中放入背景图片,背景图片在这里
页面布局 - 图7
接在src下新建common.css,以消除内外边距,设置字体

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. }
  5. div {
  6. font-family: Consolas, "楷体";
  7. box-sizing: border-box;
  8. }

现在我们在src/index.js中引用该布局看看效果

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import RichText from './pages/RichText';
  4. import BasicLayout from './layouts/BasicLayout'
  5. import './common.css'
  6. ReactDOM.render(<BasicLayout>
  7. <RichText />
  8. </BasicLayout>,
  9. document.getElementById("root"));

如下:
页面布局 - 图8

LoginLayout

在layouts下新建LoginLayout文件夹,在LoginLayout中新建index.jsx和index.module.css。有了BasicLayout的经验,代码的内容不必解释,直接上代码。index.jsx

  1. import React from 'react'
  2. import styles from './index.module.css'
  3. import Header from './../../components/Header'
  4. function LoginLayout(props) {
  5. const { children } = props;
  6. return (
  7. <div className={styles.box}>
  8. <div className={styles.container}>
  9. <Header />
  10. <div className={styles.main}>
  11. {children}
  12. </div>
  13. </div>
  14. </div>
  15. )
  16. }
  17. export default LoginLayout

index.module.css

  1. .box {
  2. width: 100%;
  3. background: #d8e2eb url(./../../assets/img/bg.jpg) no-repeat top center;
  4. min-height: 100vh;
  5. }
  6. .container {
  7. max-width: 1200px;
  8. margin: 0 auto;
  9. padding: 0 50px;
  10. }
  11. .main {
  12. width : 300px;
  13. margin: 0 auto;
  14. }