这篇文章来讲解如何实现Layout布局,采用上中下的布局。
上方 就是 导航区域,中间是内容区域,下方是 底部区域。
整个系统使用 蚂蚁团队开源的 antd design UI库
我们先安装下 antd design
// 安装yarn add antd// 引入样式import 'antd/dist/antd.css';
组件库
首先在根目录创建components文件夹,这里来放 各个组件
Layout
在compoents 文件夹 新建layout文件夹,在layout文件夹新建index.tsx
mkdir componentscd componentsmkdir layouttouch index.tsx
Navbar
在compoents 文件夹 新建Navbar文件夹,在Navbar文件夹新建index.tsx,同时创建index.module.scss
cd componentsmkdir Navbarcd Navbartouch index.tsxtouch index.module.scss
Footer
在compoents 文件夹 新建Footer文件夹,在Footer文件夹新建index.tsx,同时创建index.module.scss
cd componentsmkdir Footercd Footertouch index.tsxtouch index.module.scss
这样先把Layout,Navbar, Footer的架子 搭建起来。
然后开始写 Layout的布局
在 layout/index.tsx中写入, 中间的内容区域,由 props的children来填充,这样的话 ,就实现了 上中下的布局
import type { NextPage } from 'next';import Navbar from 'components/Navbar';import Footer from 'components/Footer';const Layout: NextPage = ({ children }) => {return (<div><Navbar /><main>{children}</main><Footer /></div>)}export default Layout;
写好上面代码以后,需要再入口文件引入 layout
在 _app.tsx中引入 layout
import Layout from 'components/layout'import { NextPage } from 'next';return (<Layout><Component /></Layout>);
Navbar
接下来 来开发 上部导航区域
先看下要实现的效果图,如下:
这里采用 flex 布局
先把博客系统的名称写下,在Navbar/index.tsx文件下
<div className={styles.navbar}><section className={styles.logoArea}>BLOG</section></div>
然后开始写标签,这几个标签,采用配置的方式,这里我们再 Navbar文件夹下新建 config.ts 来 存放 这几个导航数据
export const navs: any[] = [{label: '首页',value: '/',},{label: '咨询',value: '/info',},{label: '标签',value: '/tag',},];
在Navbar/index.tsx拿到config中的导航数据,然后遍历渲染出来
同时引入 next提供的link,来进行路由跳转
import Link from 'next/link';import { navs } from './config';<section className={styles.linkArea}>{navs?.map((nav) => (<Link key={nav?.label} href={nav?.value}><a className={pathname === nav?.value ? styles.active : ''}>{nav?.label}</a></Link>))}</section>
最后再添加两个 写文章 和登录的按钮
<section className={styles.operationArea}><Button onClick={handleGotoEditorPage}>写文章</Button><Button type="primary" onClick={handleLogin}>登录</Button></section>
最后整体的样式文件如下:
.navbar {height: 60px;background-color: #fff;border-bottom: 1px solid #f1f1f1;display: flex;align-items: center;justify-content: center;.logoArea {font-size: 30px;font-weight: bolder;margin-right: 60px;}.linkArea {a {font-size: 18px;padding: 0 20px;color: #515767;}.active {color: #1e80ff;}}.operationArea {margin-left: 150px;button {margin-right: 20px;}}}
这样 导航部分的 初始页面就完成了
Footer
接下来简单写下Footer部分
在 components/Footer/index.tsx中写入如下代码:
import type { NextPage } from 'next';import styles from './index.module.scss';const Footer: NextPage = () => {return (<div className={styles.footer}><p>博客系统</p></div>);};export default Footer;
.footer {text-align: center;color: #72777b;padding: 20px;}
这样简单的footer部分就完成了
最后看下 这样写下来的效果
