设计系统UI组件前端【免费下载链接】basewebA React Component library implementing the Base design language项目地址https://gitcode.com/gh_mirrors/ba/baseweb点击查看免费下载侧边导航菜单Side Navigation是 Base Web 中用于网站多层级导航的核心组件它以一棵可嵌套的链接列表为用户呈现站点的信息架构。本文将围绕 side-navigation/README.md 展开先给出开箱即用的用法示例再逐一拆解Navigation、StatefulNavigation、StatefulContainer的 API 与内部实现并结合 nav.tsx、nav-item.tsx 等源码与测试用例说明受控/非受控模式、多级子菜单、无障碍支持与定制点帮助你直接上手并在大型项目中正确使用与扩展该组件。组件概述与适用场景侧边导航是一组用于网站导航的链接列表并且天然支持多级结构multi-level structure。在 Base Web 中它常被用于文档站、后台管理界面或任何需要左侧目录 右侧内容布局的场景典型形态是顶层导航项如Colors下挂可展开的子导航项如Shades子导航项下还可继续嵌套更深层级的子项如Light每一项都可以携带一个itemId作为唯一标识用于高亮当前激活的条目。组件入口定义在 src/side-navigation/index.ts公开的导出包括Navigation无状态受控组件NavItem单条导航项的底层实现同时被导出便于单独使用StatefulNavigation内部自带选中状态的有状态组件StatefulContainer有状态逻辑容器一组Styled*样式组件StyledRoot等与全部类型定义快速上手基础用法README 给出的最小使用方式非常简洁直接导入StatefulNavigation并传入items数组即可import * as React from react; import {StatefulNavigation} from baseui/side-navigation; StatefulNavigation items{[]} /README 中的进阶用法Advanced usage同样展示了这一入口实际项目中通常以函数组件形式返回导航import * as React from react; import {StatefulNavigation} from baseui/side-navigation; export default () { return StatefulNavigation items{[]} /; };这里的StatefulNavigation是一个非受控封装它内部用StatefulContainer管理activeItemId状态你无需手动维护当前选中项点击导航项即可自动切换高亮。对应的测试 stateful-nav.test.tsx 展示了带真实数据的渲染方式可见items数组中每个对象至少需要title标题有子菜单时再提供subNav数组可点击/可选中项需要提供itemIdconst nav [ { title: Colors, subNav: [ { title: Shades, itemId: #level1.1.2, subNav: [ { title: Light, itemId: #level1.1.2.2, }, ], }, ], }, { title: Sizing, itemId: #level1.2, }, { title: Typography, itemId: #level1.3, }, ];数据模型Itemitems中的每一项对应 types.ts 中的Item类型字段类型说明titleReact.ReactNode导航项渲染出的标题文本必填itemIdstring该项的标识符可以是路径值如/、#level1.2或动作名默认的activePredicate用它来判定当前激活项subNavItem[]该项下的子导航项列表用于构建多级结构disabledboolean置为true时该项渲染为禁用态Exports 与受控 / 非受控模式README 将组件导出归纳为四类Navigation、StatefulNavigation、StatefulContainer以及StyledRoot。从源码看它们形成了清晰的分层架构StatefulNavigationstateful-nav.tsx只是把StatefulContainer与Navigation组合起来的函数组件export default function StatefulNavigation(props: StatefulNavProps) { return ( StatefulContainer {...props} {(childrenProps) Navigation {...childrenProps} /} /StatefulContainer ); }StatefulContainerstateful-container.ts负责状态管理。其初始状态为{ activeItemId: }可被initialState覆盖点击导航项时触发internalSetState(STATE_CHANGE_TYPE.change, item)将新状态置为{ activeItemId: item.itemId }状态变更类型定义在 constants.ts 中目前只有change一种export const STATE_CHANGE_TYPE { change: change, } as const;Navigationnav.tsx是纯展示组件接收activeItemId等 props 完成渲染。因此需要在多个页面间同步选中态、或由路由/URL 驱动高亮时使用受控的Navigation只需要点一下自动高亮的简单场景使用StatefulNavigation更省事。StyledRoot是根容器样式组件定义于 styled-components.tsx渲染为nav元素应用了主题中的typography.font300与colors.contentPrimary并清空所有默认边距。Navigation 受控组件 API 详解README 列出了Navigation的四个核心 APIactive、onChange、onItemExpand、onItemCollapse。对照 types.ts 中的NavigationProps实际实现对这些能力做了更细致的划分激活态activeItemId 与 activePredicateactiveItemId: string必填当前激活项的itemId默认值为/见 nav.tsx 的defaultProps。在受控模式下它由你维护Navigation据此渲染高亮。activePredicate?: (item, activeItemId) boolean渲染每个导航项时被调用返回true即视为激活。默认实现是对比item.itemId activeItemId。当你需要更复杂的匹配规则例如按 URL 前缀、忽略大小写、或对特定项做逻辑判断时可以传入自定义谓词函数。README 中提到的active在实现层面并非Navigation的直接 prop而是下发给每个导航项容器的$active共享样式属性SharedProps由activePredicate的计算结果派生而来见 nav.tsx。交互回调onChange 与键盘支持onChange?: ({ item, event }) unknown导航项被选中时触发。事件对象event同时覆盖鼠标点击Event与键盘回车KeyboardEvent两种来源。展开/收起相关README 提到的onItemExpand/onItemCollapse在当前的 types.ts 与实现中并未作为独立回调出现——多级子菜单的展开收起由子项始终渲染子项subNav直接递归渲染于 nav.tsx的始终可见模式实现不依赖展开/收起状态。需要说明的是若你的需求依赖这两个回调可以推断它们是早期 API 设计或文档遗留描述应以当前仓库源码的实际 props 为准。其他增强 Propsitems: Item[]导航项数据必填。mapItem?: (item) Item可选的项变换函数在渲染每个Item含递归处理后的subNav前调用适合对数据做统一加工。itemMemoizationComparator?: (a, b) boolean性能优化用。NavItem被React.memo包裹见 nav-item.tsx默认比较函数返回false即始终重渲染当导航项数量很多时传入自定义比较器可跳过不必要的重渲染。overrides?: NavigationOverrides见下文定制与 Overrides。多级子菜单的渲染原理从 nav.tsx 的实现看子菜单是递归渲染的renderNavItem对每个item渲染一个NavItemContainer内部先渲染NavItem链接若该项存在subNav则在SubNavContainerul rolelist中继续递归渲染下一级子项层级level随之1。这个$level被写入SharedProps进而控制每级子项的左侧缩进styled-components.tsx 中paddingLeft: calc(scale800 * $level)形成清晰的层级视觉。测试场景 nav.scenario.tsx 里构造了Colors → Shades → Light的三级结构正是这一递归行为的直接验证。递归渲染也意味着只要items数据足够深导航层级可以无限嵌套每个导航项容器的key由索引、层级与标题或itemId组合生成保证同级节点稳定可辨识。StatefulContainer 的状态管理细节作为有状态逻辑容器StatefulContainerstateful-container.ts支持两个额外 propsinitialState?: { activeItemId?: string }非受控组件的初始状态例如可以让页面首次加载时默认高亮某一项。stateReducer?: (stateType, nextState, currentState) State状态变更处理函数用于覆盖默认的状态转移逻辑。默认实现直接返回nextState你可以借此实现只允许选中某些项记录最近访问等自定义行为。其渲染模式是 render propsStatefulContainer把children作为函数调用传入合并了自身状态与onChange的 props见 stateful-container.ts再由StatefulNavigation把这份 props 交给Navigation渲染。因此上述Navigation的 API 在StatefulNavigation上同样可用并且额外支持initialState与stateReducer。Accessibility 无障碍支持README 以单独的Accessibility章节收尾源码中对应落实为多项无障碍细节根容器渲染为语义化的nav并带有data-basewebside-navigation标记nav.tsx。顶级与子级列表分别使用ul/li并声明rolelistnav.tsx保持语义结构。每个链接通过NavItem的handleKeyDown支持键盘回车触发选中nav-item.tsx配合 focusVisible 提供的isFocusVisible判断仅在键盘聚焦时显示焦点环3px solid borderAccent鼠标点击时则无焦点圈避免视觉噪音styled-components.tsx。禁用项渲染为span而非a、不设href、tabIndex置为-1nav-item.tsx既移出 Tab 键序又通过cursor: not-allowed与禁用色contentStateDisabled传达禁用语义。RTL 支持StyledNavItemElement根据主题的direction自动把左侧边框、内边距镜像为右侧见 styled-components.tsx仓库中亦有 nav-rtl.scenario.tsx 场景与 nav.e2e.ts 端到端测试佐证。样式定制Overrides 与共享样式属性NavigationOverridestypes.ts开放了五个覆盖点Override 键默认组件作用RootStyledRoot根nav容器NavItemContainerStyledNavItemContainer单个导航项的li容器NavLinkStyledNavLink导航链接aNavItemStyledNavItem导航项内部的内容元素SubNavContainerStyledSubNavContainer子级导航ul列表覆盖方式与 Base Web 其他组件一致在 nav.scenario.tsx 中有现成示例Navigation items{nav} overrides{{ Root: { props: { data-test: e2e } } }} /样式层通过SharedProps$active、$level、$selectable、$disabled见 types.ts将状态传递给样式组件激活项拥有backgroundInversePrimary背景与borderSelected的 4px 左侧高亮条可点击项悬停变色、指针为pointer禁用项使用禁用色与not-allowed光标缩进随$level逐级递增。这些细节全部集中在 styled-components.tsx是你定制视觉时最需要关注的样式文件。小结一套导航两种模式侧边导航组件遵循 Base Web 一贯的受控/非受控双轨设计简单场景直接用StatefulNavigation让StatefulContainer帮你管理激活态需要路由联动或精确控制高亮时改用受控的Navigation配合activeItemId、activePredicate、onChange与overrides即可。多级子菜单由递归渲染天然支持无障碍与 RTL 也已在底层得到处理——参照 index.ts、nav.tsx、types.ts 与 styled-components.tsx你可以快速定位并扩展每一个渲染环节。赞分享设计系统UI组件前端【免费下载链接】basewebA React Component library implementing the Base design language项目地址https://gitcode.com/gh_mirrors/ba/baseweb点击查看免费下载相关推荐Vant Sidebar 侧边导航组件实战指南从 API 用法到源码原理Vant Sidebar 侧边导航组件实战指南从 API 用法到源码原理 Sidebar 是 Vant 移动端组件库中用于垂直展示的导航栏组件帮助用户在多个前端UI组件深入掌握 Mesop 的 Sidenav 侧边导航组件从 API 用法到源码级实现原理深入掌握 Mesop 的 Sidenav 侧边导航组件从 API 用法到源码级实现原理 导读 Sidenav 是 Mesop 中基于 Angular Mate前端后端Web框架Vant NavBar 导航栏组件完全指南从基础用法到源码级原理Vant NavBar 导航栏组件完全指南从基础用法到源码级原理 导读 本文全面解析 Vant 移动端 UI 库中的 NavBar 导航栏组件 https:/前端UI组件上一篇探索企业通讯的未来Mattermost Mobile v2 开源应用下一篇终极指南如何优化bert-large-nli-stsb-mean-tokens在中文场景下的应用效果创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
oh-my-opencode-slim 文件操作后委托提醒钩子(post-file-tool-nudge)源码级解析 人工智能AI AgentAgent 编排AI 技能 【免费下载链接】oh-my-opencode-slim Lean, fine tuned Opencode multi agent suite Mix any models Auto delegate tasks 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim 点击查看 免费下载 本篇文章围绕… · 2026/9/25 2:15:25
终端树状结构打印库 GoTree 深度解析:原理、用法与在 buildah 镜像层树中的落地实践 云原生 【免费下载链接】buildah A tool that facilitates building OCI images. 项目地址: https://gitcode.com/gh_mirrors/bu/buildah 点击查看 免费下载 本文以仓库内 vendor/github.com/disiqueira/gotree/v3/README.md 为主体,结合其源码 gotree.… · 2026/9/25 2:15:24
Ubuntu安装界面显示异常的底层原理与修复指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 2:15:18
STM32 HAL库DMA+IDLE+状态机解析SBUS协议实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 2:46:58
专科毕业论文AI工具实测:九款软件组合与全流程配置指南 专科生的毕业论文难不难?我不想灌鸡汤,直接说结论:难,但不是难在深度,而是难在没人告诉你怎么拆解。我自己当年也是一边实习一边抽空搞论文,白天上班晚上憋字,导师的标准一句比一句抽象。后来我… · 2026/9/25 2:46:58
Rust Design Patterns 反模式解析:以 Clone 取悦借用检查器的代价与正确替代方案 文档教程 【免费下载链接】patterns A catalogue of Rust design patterns, anti-patterns and idioms 项目地址: https://gitcode.com/gh_mirrors/pa/patterns 点击查看 免费下载 导读
本文深入剖析 Rust 反模式(anti-pattern)"Clone… · 2026/9/25 2:46:58
Codex 401 unauthorized 报错排查指南:认证链路拆解与一步修复 1. 先搞清楚 401 到底卡在哪一环Codex 报401 unauthorized这件事,我前前后后帮人排查过不下几十次,说实话它本身一点都不复杂,复杂的是大家一看到 401 就慌,然后开始乱改配置,把本来能跑的环境改得更乱。401 的本质只有… · 2026/9/25 2:46:58
行式存储在大数据日志分析中的选型与落地实践 行式存储在大数据日志分析系统中的应用,这个话题在列式存储、分析型数据库大行其道的今天,看起来有点“复古”。但真正在日志分析一线摸爬滚打过的朋友应该都有体会:日志数据的写入模式和查询模式,跟普通业务数据、甚至和BI分析数… · 2026/9/25 2:46:52
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37