rsuite Sidenav 完整布局实战:Header、Body 与 Footer Toggle 折叠导航栏
前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载本文以 rsuite 文档中 Sidenav footer 示例 为骨架讲解如何用Sidenav、Nav、Sidenav.Toggle以及HStack/VStack/InputGroup等布局组件构建一个带品牌区、搜索框与折叠开关的完整侧边导航栏。读完本文你将掌握 Sidenav 三段式结构Header / Body / Footer的组装方式、expanded受控状态的切换原理以及折叠态下组件如何联动响应并能在自己的 React 项目中直接复刻这套代码。一、示例目标一个可折叠的完整侧边栏docs/pages/components/sidenav/fragments/footer.md给出的示例是一个典型的后台管理系统侧边栏顶部是品牌 Logo 与搜索框中间是五个带图标的导航菜单项底部是展开/折叠切换按钮。整体结构如下Box w{240} Sidenav expanded{expanded} Sidenav.Header Header expanded{expanded} / /Sidenav.Header Sidenav.Body Nav Nav.Item icon{DashboardIcon /}Overview/Nav.Item {/* ... 其余菜单项 */} /Nav /Sidenav.Body Sidenav.Footer Sidenav.Toggle onToggle{setExpanded} / /Sidenav.Footer /Sidenav /Box在这个示例中Box w{240}为侧边栏设置了固定宽度容器expanded是一个React.useState(true)管理的受控状态由Sidenav.Toggle的onToggle回调驱动更新。从 src/Sidenav/Sidenav.tsx 源码可以看到Sidenav的expanded属性默认值为true并通过Transitiontimeout{300}为宽度变化提供 300ms 的折叠/展开过渡动画。二、三段式结构Header / Body / Footer 的职责划分Sidenav组件通过静态子组件Subcomponents挂载了Header、Body、Footer、GroupLabel、Toggle五个子组件见 src/Sidenav/Sidenav.tsx。其中Header、Body、Footer本身是纯粹的结构化容器由createComponent生成为普通div元素见 SidenavHeader.tsx、SidenavBody.tsx、SidenavFooter.tsx真正的行为逻辑由Nav与Sidenav.Toggle承载。1. Header品牌区与搜索框的折叠联动示例中的Header是一个自定义组件根据expanded状态切换渲染内容const Header ({ expanded }) { if (!expanded) { return ( HStack justifyContentcenter SiProtondb size{32} / /HStack ); } return ( VStack p10px 10px 0 10px spacing{12} HStack SiProtondb size{32} / Brand /HStack InputGroup inside sizesm InputGroup.Addon SearchIcon / /InputGroup.Addon Input typesearch placeholderSearch here... / /InputGroup /VStack ); };折叠态expanded false只居中显示品牌图标避免在窄条侧边栏中撑开宽度。展开态使用VStack垂直排列组合「品牌名 搜索框」spacing{12}控制垂直间距InputGroup inside实现图标内嵌的搜索输入框配合rsuite/icons/Search图标。搜索框在折叠时被移除这是侧边栏折叠设计的常见做法因为 52px 宽的窄条无法容纳输入控件。对应样式上src/Sidenav/styles/index.scss中.rs-sidenav-header通过padding: var(--rs-sidenav-header-p)控制内边距而折叠态.rs-sidenav-collapse-out会隐藏所有.rs-sidenav-item-title文本仅保留居中的图标。2. Body菜单导航的核心区域Sidenav.Body内部渲染Nav组件及五个Nav.Item每个菜单项都通过icon属性挂载rsuite/icons图标Nav Nav.Item icon{DashboardIcon /}Overview/Nav.Item Nav.Item icon{PeoplesIcon /}Customers/Nav.Item Nav.Item icon{PieChartIcon /}Analytics/Nav.Item Nav.Item icon{DataAuthorizeIcon /}Security/Nav.Item Nav.Item icon{SettingIcon /}Settings/Nav.Item /Nav从样式源码看.rs-sidenav-body采用flex: 1 1 auto; overflow: auto保证菜单区域在侧边栏中自动撑满剩余高度并在内容超长时可滚动折叠时.rs-sidenav-collapse-out .rs-sidenav-body则改为overflow: inherit让下拉子菜单可以溢出显示。折叠态下.rs-sidenav-item会通过justify-content: center与height: var(--rs-sidenav-item-height)36px实现图标垂直居中的窄条样式并隐藏文字标题。3. Footer折叠开关的挂载位置Sidenav.Footer在样式上拥有自己的职责src/Sidenav/styles/index.scss中.rs-sidenav-footer设置了border-top: 1px solid上边框、margin-top: auto推到容器底部以及padding: var(--rs-sidenav-footer-p)。示例将Sidenav.Toggle放在此处视觉上形成「菜单列表 → 分隔线 → 折叠按钮」的经典底栏布局。三、Sidenav.Toggle折叠开关的工作原理Sidenav.Toggle是本示例的核心交互元素其实现位于 src/Sidenav/SidenavToggle.tsxconst sidenav useContext(SidenavContext); if (!sidenav) { console.error(Sidenav.Toggle must be rendered within a Sidenav); return null; } const expanded sidenav.expanded; const handleToggle useEventCallback((event) { onToggle?.(!expanded, event); onClick?.(event); }); return ( IconButton icon{ArrowLeftLineIcon aria-label /} onClick{handleToggle} aria-label{expanded ? Collapse : Expand} {...rest} / );几个关键实现细节依赖 Sidenav ContextSidenav.Toggle通过useContext(SidenavContext)读取expanded状态。若被渲染在Sidenav之外会输出错误信息并返回null。SidenavContext在 src/Sidenav/SidenavContext.tsx 中定义由Sidenav在渲染时通过SidenavContext.Provider注入expanded、openKeys、onOpenChange等值。受控回调点击按钮时调用onToggle(!expanded, event)。示例中的onToggle{setExpanded}直接把新的展开状态写回 React state实现真正的受控折叠。无障碍支持按钮的aria-label随状态切换为Collapse或Expand折叠时图标ArrowLeftLineIcon旋转 180°样式见.rs-sidenav-toggle-collapsed .rs-icon。图标动画.rs-sidenav-toggle的图标transition: transform 0.3s ease折叠/展开时箭头平滑旋转。在 SidenavToggle 测试 中验证了这些行为展开态渲染Collapse按钮、折叠态渲染Expand按钮、点击触发onToggle(false, event)以及脱离Sidenav渲染时抛出错误。四、样式与动画折叠如何“动”起来侧边栏的宽度切换并非瞬间完成而是由 src/Sidenav/Sidenav.tsx 中的Transition组件驱动根据expanded状态在展开collapse-in、折叠collapse-out与过渡collapsing三种 className 间切换。对应的样式定义在 src/Sidenav/styles/index.scssCSS 变量默认值作用--rs-sidenav-width52px折叠态侧边栏宽度--rs-sidenav-collapse-in-width100%展开态宽度撑满容器--rs-sidenav-collapse-transition0.15s ease-in宽度过渡时长与缓动--rs-sidenav-item-height36px折叠态菜单项高度--rs-sidenav-header-p/--rs-sidenav-footer-p派生自--rs-sidenav-pHeader / Footer 内边距展开态.rs-sidenav-collapse-in将宽度设为100%菜单文字、搜索框等全部可见折叠态.rs-sidenav-collapse-out将宽度收缩到52px文字通过sideNavFoldedText关键帧动画淡出max-width200px → 0透明度 0.8 → 0折叠后的下拉菜单.rs-dropdown-menu会脱离窄条以浮层形式从inset-inline-start: 28px位置展开——这正是示例中折叠后仅剩图标、点击可弹出子菜单的基础。需要说明的是示例中的Box w{240}是侧边栏展开时的容器宽度实际项目中也可以让Sidenav直接占据布局宽度并通过expanded切换实现「宽 240px ⇆ 窄 52px」的布局自适应。五、完整可运行示例将示例中的ReactDOM.render替换为现代 React 的createRoot后完整代码可直接运行需安装rsuite、rsuite/icons、react-iconsimport { useState } from react; import DashboardIcon from rsuite/icons/Dashboard; import PeoplesIcon from rsuite/icons/Peoples; import SettingIcon from rsuite/icons/Setting; import PieChartIcon from rsuite/icons/PieChart; import DataAuthorizeIcon from rsuite/icons/DataAuthorize; import SearchIcon from rsuite/icons/Search; import { Sidenav, Nav, HStack, VStack, Input, InputGroup, Box } from rsuite; import { SiProtondb } from react-icons/si; const Header ({ expanded }) { if (!expanded) { return ( HStack justifyContentcenter SiProtondb size{32} / /HStack ); } return ( VStack p10px 10px 0 10px spacing{12} HStack SiProtondb size{32} / Brand /HStack InputGroup inside sizesm InputGroup.Addon SearchIcon / /InputGroup.Addon Input typesearch placeholderSearch here... / /InputGroup /VStack ); }; const App () { const [expanded, setExpanded] useState(true); return ( Box w{240} Sidenav expanded{expanded} Sidenav.Header Header expanded{expanded} / /Sidenav.Header Sidenav.Body Nav Nav.Item icon{DashboardIcon /}Overview/Nav.Item Nav.Item icon{PeoplesIcon /}Customers/Nav.Item Nav.Item icon{PieChartIcon /}Analytics/Nav.Item Nav.Item icon{DataAuthorizeIcon /}Security/Nav.Item Nav.Item icon{SettingIcon /}Settings/Nav.Item /Nav /Sidenav.Body Sidenav.Footer Sidenav.Toggle onToggle{setExpanded} / /Sidenav.Footer /Sidenav /Box ); }; export default App;六、进阶折叠态下的菜单与状态管理Sidenav不止于视觉折叠还通过openKeys机制管理多级菜单的展开状态defaultOpenKeys非受控模式下默认展开的菜单eventKey数组openKeysonOpenChange受控模式下由外部接管菜单开合折叠态下点击带有子菜单的菜单项时会以浮层 Tooltip 形式展示子菜单——这在 Sidenav 测试 中有明确验证mouseOver弹出tooltip点击后关闭。此外appearance属性支持default | inverse | subtle三种风格分别对应 styles/index.scss 中的默认浅色、深色反白与透明背景三套样式均通过data-appearance属性区分。activeKey与onSelect已标记为deprecated官方建议改用Nav activeKey与Nav onSelect见 src/Sidenav/Sidenav.tsx示例代码中正是采用「在Sidenav.Body内放Nav」的推荐写法路由切换时只需给Nav传入activeKey即可高亮当前菜单。七、总结footer.md示例演示了 rsuiteSidenav组件的完整三段式组装Sidenav.Header承载品牌与搜索随expanded联动显隐Sidenav.Body承载Nav菜单Sidenav.Footer挂载Sidenav.Toggle完成折叠开关。其背后是SidenavContext对expanded的共享注入、Transition组件的 300ms 动画驱动以及 CSS 变量与关键帧动画对窄条折叠态的样式支撑。掌握这套模式后你可以轻松在管理后台、数据看板等场景中快速落地一个可折叠、可无障碍操作的侧边导航。相关源码索引Sidenav 主组件、Sidenav.Toggle、SidenavContext、Sidenav 样式、Sidenav 测试赞分享前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载相关推荐rsuite Sidenav 受控展开与折叠从 Toggle 到源码级实现解析rsuite Sidenav 受控展开与折叠从 Toggle 到源码级实现解析 Sidenav侧边导航栏是 rsuite 中用于页面侧边栏导航的核心组件前端UI组件RSuite Sidenav 组件完整指南构建可折叠、可定制、多级分组的页面侧边栏导航RSuite Sidenav 组件完整指南构建可折叠、可定制、多级分组的页面侧边栏导航 Sidenav 是 RSuite 中对页面侧边栏场景下的 Nav 导航前端UI组件RSuite Navbar 导航栏组件基础用法从 Brand 到响应式布局的完整实战RSuite Navbar 导航栏组件基础用法从 Brand 到响应式布局的完整实战 导读 本文以 RSuite 官方文档中 Navbar 组件的基础示例前端UI组件上一篇Argo Workflows Inputs 机制全解析模板间参数、工件与卷的传递模型含 Java SDK 类型说明下一篇PHP-CS-Fixer numeric_literal_separator 规则完全指南为数字字面量自动添加/移除下划线分隔符创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Blazor Admin 请求到底是怎么跑起来的?从页面到数据库的完整调用链

Blazor Admin 请求到底是怎么跑起来的?从页面到数据库的完整调用链

本文对应版本:EasyAdminBlazor 2.3.0。 源码位置: EasyAdminBlazor/AdminExtensions.cs(注册与中间件)EasyAdminBlazor/AdminContext.cs 及 8 个 partial:Auth / Authorization / Cookie / Favorites / Navigation /…

2026/10/10 15:48:25 阅读更多 →
SQLDelight 类型投影(Type Projections)与自定义 Mapper 实战指南

SQLDelight 类型投影(Type Projections)与自定义 Mapper 实战指南

后端ORM 【免费下载链接】sqldelight SQLDelight - Generates typesafe Kotlin APIs from SQL 项目地址: https://gitcode.com/gh_mirrors/sq/sqldelight 点击查看 免费下载 SQLDelight 默认会把每条 SELECT 查询的结果集映射为自动生成的数据类,但实际…

2026/10/10 14:52:37 阅读更多 →
MCP for Beginners 课程变更史:从 changelog.md 看 MCP 2026-07-28 规范演进与课程实战化路径

MCP for Beginners 课程变更史:从 changelog.md 看 MCP 2026-07-28 规范演进与课程实战化路径

教程文档人工智能 【免费下载链接】mcp-for-beginners This open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for deve…

2026/10/9 14:48:15 阅读更多 →

最新新闻

风电水电联合调度优化算法与工程实践

风电水电联合调度优化算法与工程实践

1. 项目背景与核心价值去年参与某省级电网清洁能源消纳项目时,我第一次接触到风-水联合调度这个课题。当时面对风电出力的强随机性和水电调节的滞后性,团队在制定优化运行方案时遇到了不少挑战。这个经历让我深刻认识到:在双碳目标下&#xf…

2026/10/14 2:21:24 阅读更多 →
从PowerDesigner迁移到PDMan:开源数据库建模与Git版本管理实践

从PowerDesigner迁移到PDMan:开源数据库建模与Git版本管理实践

1. 为什么我最终把数据库建模从商业软件迁到了PDMan做后端开发时间长了,数据库建模这件事几乎绕不开。早些年团队里清一色用PowerDesigner,画物理模型、生成DDL、导出字段文档,一套流程走下来确实顺手。但问题也很明显:正版授权费…

2026/10/14 2:21:24 阅读更多 →
微信小程序仿智行火车票开发实战:云开发+数据离线化方案

微信小程序仿智行火车票开发实战:云开发+数据离线化方案

简介:本资源是一套完整的微信小程序仿智行火车票12306系统实战项目,面向Java后端与小程序前端初学者及全栈学习者,聚焦铁路订票核心业务场景,涵盖用户查询、车次管理、订单生成等全流程功能实现。项目采用SSM(SpringSp…

2026/10/14 2:21:23 阅读更多 →
RTMP Flash播放插件替代方案:flv.js迁移实战与参数调优

RTMP Flash播放插件替代方案:flv.js迁移实战与参数调优

简介:这份资源是面向需要在网页中播放RTMP流媒体的开发者与运维人员的一套Flash播放插件实现方案,核心解决旧系统或特定场景下通过Flash技术播放RTMP直播、点播流的问题。压缩包共5个文件,约1.15MB,包含2个swf播放器与安装检测组件…

2026/10/14 2:21:23 阅读更多 →
AI编程助手代码质量救星:TypeScript静态类型约束实战

AI编程助手代码质量救星:TypeScript静态类型约束实战

AI 编程助手越帮越乱,这个话题我最近真的是感同身受。我们团队接入 AI 编程助手之后,合并请求里的代码量倒是上去了,可编译期错误非但没减少,反而冒出来一批"语法完全合法、类型对不上、一跑就崩"的代码。后来大家坐下来…

2026/10/14 2:21:23 阅读更多 →
LaTeX 2025环境配置:texlive + TeXstudio

LaTeX 2025环境配置:texlive + TeXstudio

文章目录Latex2025环境配置一、LaTeX 简介1.1 什么是 LaTeX?1.2 为什么使用 LaTeX?1.3 如何开始使用 LaTeX?二、texlive下载安装2.1 texlive下载2.2 texlive安装2.3 常见问题2.3.1 用管理员权限打开install-tl-windows.bat 报错2.3.2 Latex安…

2026/10/14 2:20:23 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →