【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 表示在新页面打开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1524043.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

无法访问Github?Steam++来帮你

前言 有许多小伙伴发现在国内访问Github真的真的很难&#xff0c;毕竟Github的DNS很容易就被***。 昨天还看到有小伙伴在群上聊天问&#xff1a;如何访问Github&#xff0c;实际上你只需要安装个加速器&#xff0c;或者使用国内的镜像站就可以轻松访问。 当然&#xff0c;如…

【面试八股总结】MySQL 锁:全局锁、表级锁、行级锁

1. 全局锁 顾名思义&#xff0c;全局锁就是对整个数据库实例加锁。 MySQL 提供了⼀个加全局读锁的方法&#xff1a; flush tables with read lock 释放全局锁&#xff0c;执行命令&#xff1a; unlock tables 需要让整个库处于只读状态的时候&#xff0c;可以使用全局锁命…

用AI将你变成二次元角色!——Face Cartoon API 使用教程

人像动漫化 API 对接说明 本文将介绍一种通过输入一张人脸照片&#xff0c;生成个性化的二次元动漫形象&#xff0c;可用于打造个性头像、趣味活动、特效类应用等场景&#xff0c;提升社交娱乐的体验。 接下来介绍下 人像动漫化 API 的对接说明。 注册试用链接 注册试用链接…

渣土车识别算法解决城市治理难题

随着城市化进程的加速&#xff0c;渣土车作为建筑工程中不可或缺的运输工具&#xff0c;其频繁的穿行和装载运输过程往往引发一系列问题&#xff0c;如超载、扬尘污染、乱倒渣土等&#xff0c;对城市环境和交通秩序造成了不良影响。为了解决这些问题&#xff0c;采用基于视觉分…

解决网站发邮件导致IP泄露的问题

原文网址&#xff1a;解决网站发邮件导致IP泄露的问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍解决网站发邮件导致IP泄露的问题。 问题描述 网站一般都会加发邮件功能&#xff0c;比如&#xff1a;用户注册时使用邮箱注册&#xff0c;通过邮箱验证码验证&#xff1b;给用…

安装Selenium进行web⾃动化测试

目录 驱动安装驱动管理工具selenium安装selenium驱动浏览器的⼯作原理自动化测试常⽤函数1. 元素定位1.1. find_element 的基本用法1.2. 常见的 find_element 定位方式1.3. find_element 的使用注意事项1.4. find_element 的进阶用法 2. 操作测试对象3. 窗口操作4. 屏幕截图5. …

牛客周赛 Round 58(ABCDF)

目录 A.会赢吗&#xff1f; B.能做到的吧 C.会赢的&#xff01; D.好好好数 F.随机化游戏时间 A.会赢吗&#xff1f; 思路&#xff1a; 签到题&#xff0c;比大小 void solve() {double a,b;cin>>a>>b;if(a>b) cout<<"NO";else cout<&…

8月刷题笔记

刷题笔记—8月 LCP40.心算挑战(贪心、排序) class Solution { public:int maxmiumScore(vector<int>& cards, int cnt) {//24.8.1ranges::sort(cards, greater()); //从大到小排序int s reduce(cards.begin(), cards.begin()cnt, 0);if(s%2 0) return s;auto rep…

阿里云Ubuntu系统安装/简单使用Kafka

一、安装kafka 1.下载安装包 1.1下载地址 https://kafka.apache.org/downloads 注意&#xff1a; 版本可以随意选择&#xff0c;我们选择版本为2.4.1 2.压缩文件上传/解压 2.1上传 2.2解压文件 #解压文件指令 tar -zxvf kafka_2.12-2.4.1.tgz -C /export/server/ #创建软…

【C/C++】C语言实现蛇形矩阵

目录 题目描述输入描述:输出描述:示例思路代码 题目描述 给你一个整数n&#xff0c;输出n∗n的蛇形矩阵。 输入描述: 输入一行&#xff0c;包含一个整数n 输出描述: 输出n行&#xff0c;每行包含n个正整数&#xff0c;通过空格分隔。 1<n<1000 示例 输入 4输出 …

集成电路学习:什么是OLED有机发光二极管

一、OLED&#xff1a;有机发光二极管 OLED&#xff0c;全称有机发光二极管&#xff08;Organic Light-Emitting Diode&#xff09;&#xff0c;是一种电流型的有机发光器件。以下是关于OLED的详细介绍&#xff1a; 二、OLED的定义与原理 OLED是基于有机半导体材料和发光材料在…

恶意代码分析 | Lab1

前言 穿插virus分析的学习&#xff0c;毕竟逆向技术最后要用在攻防中。 Lab1就没必要动态分析了&#xff0c;静态学学写法。 Lab01-01.exe 前面是内存映射技术&#xff0c;对内存进行修改操作。 将Kernel32.dll和Lab01-01.dll的内存都Map出来&#xff0c;便于后续更改&…

遥感技术在环境监测中的应用:揭秘地球变化的天眼

当我们仰望星空&#xff0c;探索宇宙的奥秘时&#xff0c;别忘了脚下的这片土地同样蕴藏着无数未解之谜。遥感技术&#xff0c;这个听起来似乎遥不可及的名字&#xff0c;其实正是我们透视地球环境变化的“天眼”。今天将带大家一探遥感技术如何在环境监测中大显身手&#xff0…

将OpenHarmony RK设备散包镜像打包为一个整包

本篇文章教大家使用瑞芯微的Linux_Pack_Firmware工具将rk设备的多个镜像文件打包为一个固件。首先感谢大佬AlgoIdeas开源的打包工具&#xff0c;开源地址&#xff1a;https://gitee.com/openharmony-driver/ril_adapter 接下来进行演示&#xff0c;下面我们使用OpenHarmony 4.…

工控常用滤波方法(限幅+中值+算术平均+滑动平均)

工控常用滤波方法 简介限幅滤波法中值滤波法算术平均滤波法滑动平均滤波 简介 在实际的工程应用中&#xff0c;实际反馈的信号由于是通过电压及电流转换而来的数字量信号&#xff0c;在现场可能会受到比较大的干扰问题&#xff0c;这样的扰动会影响控制系统的输出精度&#xf…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)1.9-1.10

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第一周 卷积神经网络&#xff08;Foundations of Convolutional Neural Networks&#xff09;1.9 池化层&#xff08;Pooling layers&#xff09;1.10 卷 积 神 经 网 络 示 例 &#xff08; …

ChatTTS容器构建教程

一、模型介绍 ChatTTS 是专门为对话场景设计的文本转语音模型&#xff0c;例如 LLM 助手对话任务。它支持英文和中文两种语言。最大的模型使用了 10 万小时以上的中英文数据进行训练。在 HuggingFace 中开源的版本为 4 万小时训练且未 SFT 的版本。 ChatTTS WebUI如下&#x…

SprinBoot+Vue二手回收微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

C++ TinyWebServer项目总结(13. 多进程编程)

本章讨论Linux多进程编程的以下内容&#xff1a; 复制进程映像的fork系统调用和替换进程映像的exec系列系统调用。僵尸进程以及如何避免僵尸进程。进程间通信&#xff08;Inter Process Communication&#xff0c;IPC&#xff09;最简单的方式&#xff1a;管道。三种System V进…

第二证券:什么是券商理财,券商理财有风险吗?

券商理财是指证券公司发行的理财产品&#xff0c;证券公司简称为券商&#xff0c;证券公司集结出资者资产主张建立的资产处理升值类产品便是券商理财产品。 券商理财产品中主要有质押式报价回购事务、收益凭证、券商资产处理计划三种。 1、质押式报价回购事务 是证券公司将契…