marimo 侧边栏布局实战:用 mo.sidebar 构建多页面应用的导航骨架

发布时间:2026/11/7 10:04:25

marimo 侧边栏布局实战:用 mo.sidebar 构建多页面应用的导航骨架 marimo 侧边栏布局实战用 mo.sidebar 构建多页面应用的导航骨架【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimo导读在 marimo 中mo.sidebar是一个特殊的布局组件它能把单元格内容渲染到编辑器与运行应用App 模式的左侧栏位而不是单元格正文内从而为多页面应用、仪表盘和作品集类 Notebook 提供持久的导航骨架。本文以 docs/api/layouts/sidebar.md 为骨架结合marimo.sidebar的源码实现、官方冒烟测试 marimo/_smoke_tests/sidebar.py 与前端marimo-sidebar自定义元素sidebar-element.tsx完整讲解mo.sidebar的用法、参数、与mo.nav_menu/mo.routes的组合模式及其底层渲染原理。读完本文你将能独立搭建带分组导航、页脚与自定义宽度侧边栏的多页面 marimo 应用。一、认识 mo.sidebar单元格之外的特殊布局在默认布局下marimo 单元格的输出按顺序纵向排列。而mo.sidebar属于“特殊布局组件”它会把内容渲染在单元格旁边左侧的侧边栏区域而不是单元格下方它必须作为单元格的最后一个表达式才能正确显示源码 docstring 明确说明This component still needs to be the last expression in the cell同一个 Notebook 中可以多次调用mo.sidebar它们会按调用顺序依次显示源码注释You may use more than onemo.sidebar- they will be displayed in the order they are called它是持久性导航的最佳载体侧边栏常驻主体区域由mo.routes或其他内容动态切换非常适合把 marimo Notebook 组织成多页面应用参见 docs/api/layouts/routes.md。这些行为约束直接来自 marimo/_plugins/stateless/sidebar.py 中sidebar类的实现属于可验证的官方行为。1.1 从 API 文档中的标准示例看起sidebar.md 给出的最小可用示例如下app.cell def __(): mo.sidebar( [ mo.md(# marimo), mo.nav_menu( { #/home: f{mo.icon(lucide:home)} Home, #/about: f{mo.icon(lucide:user)} About, #/contact: f{mo.icon(lucide:phone)} Contact, Links: { https://twitter.com/marimo_io: Twitter, https://github.com/marimo-team/marimo: GitHub, }, }, orientationvertical, ), ] ) return这个例子同时覆盖了mo.sidebar的三种典型内容来源mo.md(...)渲染的 Markdown品牌标题# marimomo.nav_menu(...)生成的纵向导航菜单含一级链接与Links分组列表形式的多个子组件由vstack自动纵向堆叠。二、API 签名与参数详解根据 sidebar.py 的__init__签名def __init__( self, item: object, footer: object | None None, *, width: str | int | None None, ) - None三个参数的含义与内部处理逻辑如下参数类型默认值说明itemobject必填—侧边栏主体内容。字符串会被自动包装为mo.md(...)列表会被自动包装为vstack(...)纵向堆叠其余对象按 HTML 渲染footerobject可选None固定在侧边栏底部的内容。字符串自动转md列表自动转vstack最终与item一起以justifyspace-between排布widthstr/int可选标准宽度侧边栏展开时的宽度接受任意合法 CSS 宽度值如300px、20rem数值会自动转为字符串以便 JSON 序列化源码中的关键处理逻辑字符串自动包装if isinstance(item, str): item md.md(item)列表自动堆叠if isinstance(item, list): item vstack(item)footer存在时主体与页脚以两端对齐方式组合item vstack([item, footer], justifyspace-between)width非空时写入self._props[width] str(width)前端据此控制展开宽度。2.1 不受支持的链式方法mo.sidebar继承自ContainerHtml但明确禁用了部分链式 API。源码中以raise TypeError显式拒绝的方法包括.batch()、.center()、.right()、.left().callout()、.style()也就是说mo.sidebar(...).style(...)这类链式调用会直接抛错侧边栏宽度只能通过构造参数width控制。三、进阶用法footer 与 width 参数实战官方冒烟测试 marimo/_smoke_tests/sidebar.py 展示了比文档示例更完整的配置可复制到你的 Notebook 中直接运行import marimo __generated_with 0.15.5 app marimo.App(widthfull) app.cell def _(mo): mo.sidebar( [ mo.md(# marimo), mo.nav_menu( { #home: f{mo.icon(lucide:home)} Home, #about: f{mo.icon(lucide:user)} About, #contact: f{mo.icon(lucide:phone)} Contact, Links: { https://twitter.com/marimo_io: Twitter, https://github.com/marimo-team/marimo: GitHub, }, }, orientationvertical, ), ], footer[ mo.md( ### Footer - [Twitter](https://twitter.com/marimo_io) - [GitHub](https://github.com/marimo-team/marimo) ) ], width500px, ) return要点拆解页脚footerfooter接收一个包含mo.md的列表源码会自动将其vstack并置于侧边栏底部与主体justifyspace-between分离适合放版权信息、外部链接或版本号宽度widthwidth500px让侧边栏展开时占 500px。官方文档建议使用任意合法 CSS 宽度值如300px、20rem图标装饰链接标签中的mo.icon(lucide:home)以 Lucide 图标为菜单项增加视觉标识mo.icon是 marimo 内置图标 API见 docs/api 相关条目。四、与 mo.nav_menu 组合构建多页面导航侧边栏最常见的搭档是mo.nav_menu后者是 marimo 官方的导航菜单组件实现在 marimo/_plugins/stateless/nav_menu.py。其签名如下def nav_menu( menu: dict[str, JSONType], *, orientation: Literal[horizontal, vertical] horizontal, ) - Html4.1 菜单数据模型与校验规则nav_menu的菜单字典支持三级结构见_build_and_validate_menu的实现一级链接{/overview: Overview}键为 href值为字符串会被当作 Markdown 渲染分组子菜单{Sales: {/sales: Overview, ...}}嵌套一层字典带描述的链接{/sales/invoices: {label: Invoices, description: View invoices}}值必须是含label必填与description可选的字典。href 校验链接必须以/、#或http开头否则抛出ValueError: Invalid href: ...源码 nav_menu.py 的validate_href。因此Notebook 内页面路由用#/path如#/home外部站点用https://...如 Twitter、GitHub 链接。orientation 参数horizontal默认适合页面顶栏或vertical适合侧边栏。官方 docstring 中给出的子菜单示例可直接用于侧边栏nav_menu mo.nav_menu( { /overview: Overview, Sales: { /sales: Overview, /sales/invoices: { label: Invoices, description: View invoices, }, /sales/customers: { label: Customers, description: View customers, }, }, }, orientationvertical, )五、配合 mo.routes 实现页面切换侧边栏负责“导航骨架”页面内容切换则由mo.routes完成。官方文档 docs/api/layouts/routes.md 给出了完整的多页面组合import marimo app marimo.App() app.cell def __(): mo.sidebar( [ mo.md(# marimo), mo.nav_menu( { #/: f{mo.icon(lucide:home)} Home, #/about: f{mo.icon(lucide:user)} About, #/contact: f{mo.icon(lucide:phone)} Contact, Links: { https://twitter.com/marimo_io: Twitter, https://github.com/marimo-team/marimo: GitHub, }, }, orientationvertical, ), ] ) return app.cell def __(): mo.routes({ #/: mo.md(# Home), #/about: mo.md(# About), #/contact: mo.md(# Contact), mo.routes.CATCH_ALL: mo.md(# Home), }) return这里的关键配合点nav_menu的链接键#/、#/about、#/contact与mo.routes的路由键一一对应mo.routes.CATCH_ALL兜底未匹配路径示例中回落到 Home侧边栏导航常驻mo.routes依据#哈希路由动态渲染主体页面——这就是 marimo 多页面应用的推荐组织方式。六、底层原理从前端 marimo-sidebar 自定义元素看渲染机制mo.sidebar的 Python 端实现最终通过build_stateless_plugin(marimo-sidebar, props, text)生成 HTML见 sidebar.py 的_build_text。前端侧marimo 通过自定义 DOM 元素marimo-sidebar把子内容“传送到”侧边栏 React 组件中实现在 frontend/src/plugins/core/sidebar-element.tsx。从源码可以梳理出以下几点实现事实DOM 传送Portal机制marimo-sidebar元素自身display: none隐藏在connectedCallback中通过slotsController.mount({ name: SlotNames.SIDEBAR, ... })把子内容挂载到侧边栏插槽slot上从而把“单元格内的输出”渲染到编辑器/App 的侧边栏区域宽度同步元素读取data-width属性并写入全局sidebarAtomJotai 状态侧边栏展开时据此设置宽度syncWidth方法中JSON.parse(width)动态更新通过MutationObserver监听子节点、属性、文本变化内容更新时自动重新渲染侧边栏updateReactComponent。侧边栏的 React 呈现、折叠切换等 UI 逻辑位于 frontend/src/components/editor/renderers/vertical-layout/sidebar/含toggle.tsx、wrapped-with-sidebar.tsx、state.ts及单元测试 sidebar.test.tsx可以推断侧边栏在编辑模式与运行模式App 模式下均可用且支持折叠/展开交互。七、实践建议与注意事项位置约定mo.sidebar必须是单元格的最后一个表达式否则不会按预期显示在侧边栏多次调用需要多个侧边栏时可直接多次调用显示顺序与调用顺序一致宽度限制使用width设置宽度而非链式.style()后者会抛TypeError菜单校验nav_menu的 href 必须以/、#或http开头组内子项必须提供字符串标签或含label的字典否则抛ValueError页面组织多页面应用推荐mo.sidebarmo.nav_menu(orientationvertical)mo.routes三件套并配合mo.icon(lucide:...)提升导航可读性可验证的完整示例仓库自带的可运行冒烟测试位于 marimo/_smoke_tests/sidebar.py包含 footer、width、垂直/水平导航菜单等全部用法是学习与调试mo.sidebar的首选参考。【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/7 18:23:54

STM32 TIM4编码器接口与位置式PID闭环控制实战

简介:本资源是一套基于STM32F10x系列芯片的PID闭环控制实战工程,面向嵌入式初学者与智能车竞赛备赛者,聚焦编码器测速、多路PWM驱动与实时PID调速三大核心能力训练。项目完整实现TIM1/TIM8双组8通道PWM输出、TIM7定时中断测速、TIM2–TIM5四路…

2026/11/1 10:18:46

Agent-Client协议架构设计与性能优化实战

1. Agent Client Protocol 全景解析:架构设计与核心机制在分布式系统与云计算领域,Agent-Client通信协议(Agent Client Protocol)作为基础设施层的核心技术,承担着控制指令下发、状态同步和数据传输的关键职能。过去十…

2026/11/7 23:45:26

大庆登高架设证在哪考?急需特种作业证才能上岗找工作

大庆登高架设证在哪考?急需特种作业证才能上岗找工作 你是不是也遇到过这种情况:好不容易找到一份工作,结果被告知必须有【大庆登高架设证】才能上岗?别急,这不是危言耸听,这是现实。特种作业证,尤其是像大庆登高架设证这种直接关系到人身安全的证件,…

2026/11/7 23:45:26

吴旗电工证怎么复审网上查询流程全解析

吴旗电工证怎么复审网上查询流程全解析 实操考试心里没底怕挂科?吴旗电工证复审流程其实没你想象的那么复杂,关键是你得提前搞清楚政策、流程、时间节点。特别是像你这样在河南劳务班组干活的,手里有电工证,复审流程搞不定,可能连活都接不了。下面我们就…

2026/11/7 23:45:26

郓城电工证在哪考内部消息告诉你怎么选靠谱机构

郓城电工证在哪考内部消息告诉你怎么选靠谱机构 证书过期了不知道怎么复审延期,你不是一个人。很多电工在一线工作多年,却因为对证书的复审流程不了解,导致证书过期,不仅影响工作,还可能面临被单位辞退的风险。最近,郓城电工圈流传出一条 内部消息…

2026/11/7 23:45:26

别踩坑!电工证理论用什么软件培训机构怎么选

别踩坑!电工证理论用什么软件培训机构怎么选 学历不高怕报不上名?别急,电工证理论用什么软件这事,咱们今天就讲透。很多刚接触特种作业的朋友,总担心自己文化水平不高,考不了电工证,其实不然,只要找对方法,找对培训机构,一样能顺利拿下低压电工证或…

2026/11/7 23:40:26

洛扎县电工证怎么考 郑州报考避坑指南

洛扎县电工证怎么考 郑州报考避坑指南 怕考不过白交培训费?你不是一个人。我认识不少想考电工证的学员,都是冲着“考证就能高薪就业”这句话来的,结果一上手就傻眼了——培训费花了小几千,考试一次没过,培训老师推着你再报个“冲刺班”,结果钱又打了水…

2026/11/7 14:54:47

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/7 0:03:08

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科 实操考试心里没底怕挂科?你不是一个人。特别是在郑州这样的城市,很多施工企业负责人和一线作业人员在报考电工证和钳工证时都面临着同样的困惑。到底该考哪个证?哪个更适合自己?哪个证书…

2026/11/7 0:03:08

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱?

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱? 之前考的证在外省能不能转过来?这个问题我遇到太多了,今天就拿广西电工证办理流程来具体说说,别再走弯路了。广西电工证的报考、复审、继续教育这些环节,如果你不了解,真的会吃大亏,尤其对于从…

2026/11/7 0:03:08

电气电工证都有哪些保姆级教程

电气电工证都有哪些保姆级教程 你是不是正愁不知道去哪报名,怕被中介坑?别急,这篇保姆级教程专为河南初次报考人员准备,帮你搞清楚 电气电工证都有哪些 ,以及如何避开那些坑。 电气电工证都有哪些?别被五花八门的证书搞懵了…

2026/11/7 14:54:47

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑