这篇文章来讲解如何实现Layout布局,采用上中下的布局。
上方 就是 导航区域,中间是内容区域,下方是 底部区域。

整个系统使用 蚂蚁团队开源的 antd design UI库

我们先安装下 antd design

  1. // 安装
  2. yarn add antd
  3. // 引入样式
  4. import 'antd/dist/antd.css';

组件库

首先在根目录创建components文件夹,这里来放 各个组件

Layout

在compoents 文件夹 新建layout文件夹,在layout文件夹新建index.tsx

  1. mkdir components
  2. cd components
  3. mkdir layout
  4. touch index.tsx

Navbar

在compoents 文件夹 新建Navbar文件夹,在Navbar文件夹新建index.tsx,同时创建index.module.scss

  1. cd components
  2. mkdir Navbar
  3. cd Navbar
  4. touch index.tsx
  5. touch index.module.scss

Footer

在compoents 文件夹 新建Footer文件夹,在Footer文件夹新建index.tsx,同时创建index.module.scss

  1. cd components
  2. mkdir Footer
  3. cd Footer
  4. touch index.tsx
  5. touch index.module.scss

这样先把Layout,Navbar, Footer的架子 搭建起来。

然后开始写 Layout的布局
在 layout/index.tsx中写入, 中间的内容区域,由 props的children来填充,这样的话 ,就实现了 上中下的布局

  1. import type { NextPage } from 'next';
  2. import Navbar from 'components/Navbar';
  3. import Footer from 'components/Footer';
  4. const Layout: NextPage = ({ children }) => {
  5. return (
  6. <div>
  7. <Navbar />
  8. <main>{children}</main>
  9. <Footer />
  10. </div>
  11. )
  12. }
  13. export default Layout;

写好上面代码以后,需要再入口文件引入 layout

在 _app.tsx中引入 layout

  1. import Layout from 'components/layout'
  2. import { NextPage } from 'next';
  3. return (
  4. <Layout>
  5. <Component />
  6. </Layout>
  7. );

Navbar

接下来 来开发 上部导航区域
先看下要实现的效果图,如下:
这里采用 flex 布局
image.png

先把博客系统的名称写下,在Navbar/index.tsx文件下

  1. <div className={styles.navbar}>
  2. <section className={styles.logoArea}>BLOG</section>
  3. </div>

然后开始写标签,这几个标签,采用配置的方式,这里我们再 Navbar文件夹下新建 config.ts 来 存放 这几个导航数据

  1. export const navs: any[] = [
  2. {
  3. label: '首页',
  4. value: '/',
  5. },
  6. {
  7. label: '咨询',
  8. value: '/info',
  9. },
  10. {
  11. label: '标签',
  12. value: '/tag',
  13. },
  14. ];

在Navbar/index.tsx拿到config中的导航数据,然后遍历渲染出来
同时引入 next提供的link,来进行路由跳转

  1. import Link from 'next/link';
  2. import { navs } from './config';
  3. <section className={styles.linkArea}>
  4. {navs?.map((nav) => (
  5. <Link key={nav?.label} href={nav?.value}>
  6. <a className={pathname === nav?.value ? styles.active : ''}>
  7. {nav?.label}
  8. </a>
  9. </Link>
  10. ))}
  11. </section>

最后再添加两个 写文章 和登录的按钮

  1. <section className={styles.operationArea}>
  2. <Button onClick={handleGotoEditorPage}>写文章</Button>
  3. <Button type="primary" onClick={handleLogin}>
  4. 登录
  5. </Button>
  6. </section>

最后整体的样式文件如下:

  1. .navbar {
  2. height: 60px;
  3. background-color: #fff;
  4. border-bottom: 1px solid #f1f1f1;
  5. display: flex;
  6. align-items: center;
  7. justify-content: center;
  8. .logoArea {
  9. font-size: 30px;
  10. font-weight: bolder;
  11. margin-right: 60px;
  12. }
  13. .linkArea {
  14. a {
  15. font-size: 18px;
  16. padding: 0 20px;
  17. color: #515767;
  18. }
  19. .active {
  20. color: #1e80ff;
  21. }
  22. }
  23. .operationArea {
  24. margin-left: 150px;
  25. button {
  26. margin-right: 20px;
  27. }
  28. }
  29. }

这样 导航部分的 初始页面就完成了

Footer

接下来简单写下Footer部分
在 components/Footer/index.tsx中写入如下代码:

  1. import type { NextPage } from 'next';
  2. import styles from './index.module.scss';
  3. const Footer: NextPage = () => {
  4. return (
  5. <div className={styles.footer}>
  6. <p>博客系统</p>
  7. </div>
  8. );
  9. };
  10. export default Footer;
  1. .footer {
  2. text-align: center;
  3. color: #72777b;
  4. padding: 20px;
  5. }

这样简单的footer部分就完成了

最后看下 这样写下来的效果
image.png