【Next】4. 全局通用布局快速搭建

2024-09-03 11:36

本文主要是介绍【Next】4. 全局通用布局快速搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

笔记来源:编程导航

基础布局

Next.js 支持全局根布局(每个页面都会生效)以及嵌套布局(可以只对部分页面生效),详情可 参考文档。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 src 下新建 layouts 目录,用于存放项目中的各种布局。在该目录下新建一个布局 BasicLayout, 是一个文件夹,包括 index.tsx 页面和 index.css 样式文件。

可以直接使用 Ant Design Procomponents 的布局组件 快速实现包含导航栏、内容、底部栏的响应式布局。

在 app 目录下的 layout.tsx 全局布局文件(可以理解为页面入口)中引入 BasicLayout:

export default function RootLayout({children,
}: Readonly<{children: React.ReactNode;
}>) {return (<html lang="zh"><body><AntdRegistry><BasicLayout>{children}</BasicLayout></AntdRegistry></body></html>);
}

可以将 lang=“en” 改为 lang=“zh”,适配国内用户访问。

然后按需精简和修改 BasicLayout 中复制来的布局代码,直到项目可以正常运行并符合预期。

整个过程中,需要注意下面这些事项:

1)BasicLayout 和 layout.tsx 页面开头添加 “use client” 声明,表示客户端渲染

2)移除 useState(useState 只能在 客户端使用,否则会出现水合报错)、将获取 pathname 改为使用 Next.js 的 usePathname 钩子获取

3)移除无用代码,比如 token、siderMenuType

4)定义布局的 children 属性:

interface Props {children: React.ReactNode;
}export default function BasicLayout({ children }: Props) {// ...
}

5)修改菜单渲染函数:

// 菜单渲染
menuItemRender={(item, dom) => (<Link href={item.path || "/"} target={item.target}{dom}</Link>
)}

6)移除 window 对象的使用,解决服务端和客户端水合不一致的问题

全局底部栏

在 src 下新建 components 目录,表示全局公用组件。

创建全局底部栏 GlobalFooter,通常用于展示版权信息,然后在 ProLayout 中展示:

footerRender={() => <GlobalFooter />

需要在 BasicLayout 的样式文件中补充底部内边距,否则有些内容可能会被底部栏遮挡住。示例样式如下:

.ant-pro-layout .ant-pro-layout-content {padding-bottom: 96px !important;
}

全局顶部导航栏

可以直接利用 Ant Design Procomponents 的 ProLayout 组件实现,不用自己编写。

将 ProLayout 的 layout 属性设置为 top,可开启顶部导航栏:

<ProLayoutlayout="top"
/>

ProLayout 将顶部导航栏从左到右分为几个区:标题区、菜单区、操作区、头像区。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1)标题区:用于展示网站图标和标题。该渲染函数有 logo 和 title 参数,可以在 ProLayout 中添加对应的属性,以展示网站图标和标题。

2)菜单区:用于展示导航栏的菜单,供用户切换页面。

3)操作区:可用于配置右侧的操作栏,比如搜索条、小按钮等。移动端可以不展示操作。

4)头像区:用于展示登录用户头像、用户昵称,鼠标悬浮上去还可以展示更多用户有关的操作按钮。

export default function BasicLayout({ children }: Props) {const pathname = usePathname();const loginUser = useSelector((state: RootState) => state.loginUser);return (<divid="basicLayout"style={{height: "100vh",overflow: "auto",}}><ProLayouttitle="面面 - 专为面试而生"layout="top"logo={<Imagesrc={"/assets/logo.png"}height={32}width={32}alt={"面面-只为面试而生"}/>}location={{pathname,}}avatarProps={{src: loginUser.userAvatar || "/assets/notLoginUser.png",size: "small",title: loginUser.userName || "访客",render: (props, dom) => {return (<Dropdownmenu={{items: [{key: "logout",icon: <LogoutOutlined />,label: "退出登录",},],}}>{dom}</Dropdown>);},}}// 操作渲染actionsRender={(props) => {if (props.isMobile) return [];return [<SearchInput key={"search"} />,<akey={"github"}href={"https://gitee.com/hao-xiugong/mianmian-frontend"}target={"_blank"}><GithubFilled key="GithubFilled" />,</a>,];}}headerTitleRender={(logo, title, _) => {return (<a>{logo}{title}</a>);}}footerRender={() => {return <GlobalFooter />;}}onMenuHeaderClick={(e) => console.log(e)}// 定义菜单menuDataRender={() => {return [{path: "/",name: "主页",target: "_blank"},{path: "/banks",name: "题库",target: "_blank"},];}}menuItemRender={(item, dom) => (<Link href={item.path || "/"} target={item.target}>{dom}</Link>)}>{children}</ProLayout></div>);
}

导航菜单配置

可以通过独立的配置文件更方便地修改导航菜单项,不用每次都修改布局代码。

实现步骤如下:

1)在 /config 目录下编写通用配置文件 menus.tsx,核心是菜单项数组,可以用 ProLayout 提供的 TypeScript 类型来规范:

import { MenuDataItem } from "@ant-design/pro-layout";
import { CrownOutlined } from "@ant-design/icons";// 菜单列表
const menus = [{path: "/",name: "主页",},{path: "/banks",name: "题库",},{path: "/questions",name: "题目",},{path: "/admin",name: "管理",icon: <CrownOutlined />,children: [{path: "/admin/user",name: "用户管理",}],},
] as MenuDataItem[];// 导出
export default menus;

2)在全局布局的 ProLayout 中引入菜单数据。

3)同步路由的更新到菜单项高亮。

同步高亮原理:可以使用 usePathname 客户端钩子函数获取到当前页面路径,然后传递给 ProLayout 的 location 属性即可自动匹配到对应 path 的菜单项。

4)扩展能力:在 ProLayout 的菜单渲染函数中可以根据菜单项的属性来自定义菜单项渲染逻辑,比如支持配置超链接是否在新页面打开。target 的值为 _blank 表示在新页面打开。

这篇关于【Next】4. 全局通用布局快速搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132856

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

CentOs7上Mysql快速迁移脚本

因公司业务需要,对原来在/usr/local/mysql/data目录下的数据迁移到/data/local/mysql/mysqlData。 原因是系统盘太小,只有20G,几下就快满了。 参考过几篇文章,基于大神们的思路,我封装成了.sh脚本。 步骤如下: 1) 先修改好/etc/my.cnf,        ##[mysqld]       ##datadir=/data/loc