尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Storybook Addon 按 Story 局部禁用指南:通过 parameters 与 paramKey 实现面板级 disable
Storybook Addon 按 Story 局部禁用指南通过 parameters 与 paramKey 实现面板级 disable关联文档docs/_snippets/button-story-disable-addon.md配套讲解见 docs/addons/addon-knowledge-base.mdx 适用对象正在基于 Storybook 官方 addon API 编写自定义面板型 Addon 的开发者以及需要在某些组件/story 上关闭面板型插件如 a11y、docs、themes的组件库维护者。在 Storybook 中一个 Addon 一旦注册通常会在其管理界面manager的底部面板PANEL或工具栏中全局显示。但实际开发中常常需要按需出现某个 Addon 只对特定组件有意义例如无障碍检测插件通常只在真实业务组件上才需要当组件库中包含大量占位组件、Mock 组件时无意义的插件面板反而会干扰使用。本指南基于 Storybook 官方仓库中的文档片段 button-story-disable-addon.md 及配套的注册片段 storybook-addon-disable-addon.md完整讲解在 Story 层面通过parameters里的{ paramKey: { disable: true } }精确禁用单个 Addon 面板的实现原理、多框架写法与官方源码级佐证读完可直接在自己的 stories 与自定义 Addon 中落地。一、原理速览paramKeydisable的约定禁用机制由两部分配合完成Addon 注册端开发者在manager.js/manager.tsx中用addons.add(PANEL_ID, { ... })注册面板时需要声明一个paramKey元素用于把该面板与某一组 Storybook parameters 关联起来addons.register(ADDON_ID, () { addons.add(PANEL_ID, { type: types.PANEL, title: My Addon, render: () divAddon tab content/div, paramKey: myAddon, // this element }); });故事编写端在某个 story 的parameters中把该paramKey对应的对象里的disable置为true该面板就会对这条 story 隐藏import type { Meta } from storybook/angular; import { Button } from ./button.component; const meta: MetaButton { component: Button, parameters: { myAddon: { disable: true }, // Disables the addon }, }; export default meta;也就是说paramKey是 Addon 与 story 之间的钥匙parameters[paramKey].disable是开关状态。Addon 注册时声明的 key 必须与 story 中写入的 parameter 键名完全一致否则 disable 不生效。需要说明的是这种按 story 的禁用只影响story 处于激活状态时面板的展示如果当前选中的不是 story 而是文档页面等其它视图Storybook 不会进行该过滤源码行为见下文第四节。二、跨框架 / 跨写作范式的完整配置示例本节完整继承关联文档中的所有写法变体。无论你使用 CSF 3 还是试验性的 CSF Next禁用语法完全一致仅meta的构造方式不同。2.1 CSF 3 —— Angularimport type { Meta } from storybook/angular; import { Button } from ./button.component; const meta: MetaButton { component: Button, parameters: { myAddon: { disable: true }, // Disables the addon }, }; export default meta;2.2 CSF Next 试验特性—— Angular / Web Components / React / VueCSF Next 使用从preview入口构造的preview.meta(...)parameters 的书写位置与 CSF 3 相同import preview from ../.storybook/preview; import { Button } from ./button.component; const meta preview.meta({ component: Button, parameters: { myAddon: { disable: true }, // Disables the addon }, });import preview from ../.storybook/preview; const meta preview.meta({ component: demo-button, parameters: { myAddon: { disable: true }, // Disables the addon }, });import preview from ../.storybook/preview; import { Button } from ./Button; const meta preview.meta({ component: Button, parameters: { myAddon: { disable: true }, // Disables the addon }, });import preview from ../.storybook/preview; import { Button } from ./Button; const meta preview.meta({ component: Button, parameters: { myAddon: { disable: true }, // Disables the addon }, });import preview from ../.storybook/preview; import Button from ./Button.vue; const meta preview.meta({ component: Button, parameters: { myAddon: { disable: true }, // Disables the addon }, });import preview from ../.storybook/preview; import Button from ./Button.vue; const meta preview.meta({ component: Button, parameters: { myAddon: { disable: true }, // Disables the addon }, });说明CSF Next 是仓库文档中标注为 的试验性写作范式要求从本地../.storybook/preview导入并调用preview.meta()好处是能继承全局类型与约定若你的项目仍使用传统 CSF 3export default导出 meta 对象请参考下方 2.3/2.4 的写法。2.3 CSF 3 —— ReactJS与通用 Web Componentsimport { Button } from ./Button; export default { /* The title prop is optional. * 用于配置 story 加载的更多细节可参考 main.js 的 stories 配置项 */ title: Button, component: Button, parameters: { myAddon: { disable: true }, // Disables the addon }, };export default { component: demo-button, parameters: { myAddon: { disable: true }, // Disables the addon }, };注意Web Components 中component传入的是自定义元素标签名字符串demo-button而非组件构造函数parameters 的用法与普通框架完全一致。2.4 CSF 3 —— ReactTS带satisfies Metatypeof Button类型收窄// Replace your-framework with the framework you are using, e.g. react-vite, nextjs, vue3-vite, etc. import type { Meta } from storybook/your-framework; import { Button } from ./Button; const meta { title: Button, component: Button, parameters: { myAddon: { disable: true }, // Disables the addon }, } satisfies Metatypeof Button; export default meta;import type { Meta } from storybook/web-components-vite; const meta: Meta { component: demo-button, parameters: { myAddon: { disable: true }, // Disables the addon }, }; export default meta;2.5 写法要点小结维度要点目标层级在meta即组件级parameters上声明会对该组件下所有 story生效如需精确到某一条 story把相同结构写到该 story 对象的parameters里即可键名myAddon仅是示例必须与 Addon 注册时addons.add(..., { paramKey })的paramKey值一致如官方 a11y 插件的键为a11y值结构{ disable: true }任何 truthy 值在官方实现中都能触发隐藏判断title从 CSF 3 开始 title 是可选的省略时可依据文件位置自动推导不影响 parameters 行为类型安全TS 项目推荐satisfies Metatypeof Button或: Meta...让component与 Props 校验联动三、禁用范围进阶从组件全部 stories到单条 story上文 meta 级声明表示只要当前渲染的是该组件的任意一条 story面板即被隐藏。若组件里只有少量 story 需要关闭插件可以把同样的 parameter 下沉到 story 级别字段结构不变只是书写位置从export default meta移到具名 story 导出内部import type { Meta, StoryObj } from storybook/react-vite; import { Button } from ./Button; const meta { component: Button, } satisfies Metatypeof Button; export default meta; type Story StoryObjtypeof meta; // 只有这条 story 会关闭名为 myAddon 的面板 export const DoNotRunAddon: Story { parameters: { myAddon: { disable: true }, }, };反之若希望除了个别 story 之外全局关闭则可在 .storybook/preview 的全局parameters中开启 disable再在需要启用的 story 上覆盖回{ disable: false }实现默认关闭、白名单开启的反向控制。四、源码级验证Storybook 官方是如何消费这个参数的关联文档所描述的语法并非约定俗成的软约束而是被 Storybook Manager 面板容器真实读取的硬逻辑。在 code/core/src/manager/container/Panel.tsx 中面板列表的构建逻辑如下第 47-67 行通过api.getElements(Addon_TypesEnum.PANEL)拿到全部已注册面板仅当type story即当前激活的是 story 而非其它视图时才进行过滤逐面板读取其paramKey判断parameters[paramKey]存在且.disable为 truthy若是则把该面板从结果中剔除除此之外还支持两种声明式禁用p.disabled true或p.disabled为函数时执行p.disabled(parameters)得到布尔值可用于更复杂的按参数动态决定是否显示场景最终过滤后的panels传入底层 AddonPanel 组件渲染。核心判定片段对应const { paramKey }: any p; if (paramKey parameters parameters[paramKey] parameters[paramKey].disable) { return; // 从面板列表剔除 } if (p.disabled true || (typeof p.disabled function p.disabled(parameters))) { return; // 另外两种面板级禁用方式 }由此可以得出几个关键结论只要paramKey匹配disable 判断由容器统一完成Addon 的render函数无需自行感知禁用状态disable取 truthy/falsy源码中未强制要求字面量true但文档与官方示例统一使用{ disable: true }以保证可读性面板级注册 APIaddons.add(id, { type: types.PANEL, paramKey, ... })中paramKey是 Panel 类型的合法声明字段见 code/core/src/types/modules/addons.ts 中关于 panel 配置的类型定义。五、把语法应用到官方 Addon以 a11y 为例如果不想自己实现 Addon只想快速在某个 story 上关掉官方插件上述语法同样适用。仓库中 code/addons/a11y/src/constants.ts 定义了无障碍插件的键名export const PARAM_KEY a11y;而 code/addons/a11y/src/manager.tsx 在注册面板时把它作为paramKey传入因此你无需知道内部实现只要在 story 里写parameters: { a11y: { disable: true } }即可关掉 a11y 面板。其它将paramKey与参数键同名的官方 Addon 还有 docs、themes 等可在 code/addons/docs/src/manager.tsx、code/addons/themes/src/manager.tsx 中看到同样的注册模式这意味着通过同名 parameter 传入{ disable: true }即可逐 story 关闭是一个跨 Addon 的通用能力。无障碍检测的典型使用场景是Button的视觉回归 story 不需要跑 axe 规则但可访问性基准 story如带键盘导航的复杂组件需要保留面板此时就可通过 story 级parameters精确控制。六、常见踩坑与排查清单现象原因 / 排查方向写了{ disable: true }面板仍然显示① 确认paramKey与 parameters 键名完全一致大小写敏感② 确认当前激活对象是 storytype story③ 检查 Addon 是否注册为types.PANEL组件下所有 story 都关了参数写在meta级parameters作用域天然是整个组件的 stories只想关某一条把参数下沉到具体具名 story 的parameters字段disable 写错层级不生效确认结构是{ [paramKey]: { disable: true } }不能写成{ disable: true }平铺在顶层CSF Next 不生效确认preview.meta({ ... })返回的对象被export default导出且parameters在 meta 顶层七、配套文档继续阅读注册语法与addons.add面板类型addon 注册示例 与 禁用配套注册片段该语法所属的 Addon 知识库章节Disable the addon paneladdon-knowledge-base.mdx面板容器过滤逻辑实现code/core/src/manager/container/Panel.tsx以a11y为paramKey的官方实现code/addons/a11y/src/manager.tsx、code/addons/a11y/src/constants.ts创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

从源码生成参考文档:Lingo.dev 的 CLI 与 i18n.json 配置文档自动生成脚本解析

从源码生成参考文档:Lingo.dev 的 CLI 与 i18n.json 配置文档自动生成脚本解析

从源码生成参考文档:Lingo.dev 的 CLI 与 i18n.json 配置文档自动生成脚本解析 【免费下载链接】replexica Open-source localization engineering tools. Connects to Lingo.dev localization engineering platform for consistent, quality translations. 项目地…

📅 2026/9/18 22:01:35
Ollama 部署 DeepSeek R1:本地知识库与 API 实践

Ollama 部署 DeepSeek R1:本地知识库与 API 实践

简介:这份《DeepSeek 极简部署手册》面向希望在本地跑通大语言模型、又不愿折腾复杂环境的研究者、开发者与AI技术爱好者,尤其适合初次接触 DeepSeek R1 的入门者。资源以PDF形式提供,共1个文件,压缩包约819KB,篇幅精简…

📅 2026/9/18 22:01:35
RealSense点云生成完整流程

RealSense点云生成完整流程

RealSense点云生成完整流程 【免费下载链接】librealsense RealSense SDK 项目地址: https://gitcode.com/GitHub_Trending/li/librealsense librealsense 是 RealSense 深度相机的官方开源跨平台 SDK,机器人社区做 3D 视觉的默认底座。这篇带你把 D455 的彩…

📅 2026/9/18 22:01:35
MORE NEWS

更多资讯

📰

WorkBuddy深度拆解:AI工作台的产品化、生态与规模工程

WorkBuddy最近讨论度很高,后台也收到很多读者私信,问它跟Claude Code到底怎么选、接DeepSeek要怎么配、Skills到底怎么用。我从早期版本一路用到现在,今天不吹不黑,把这款工具真正值得讲的部分拆开说清楚。先说结论:单…

📰

AWS SDK for Java v2 事件流备用语法设计解析:Running{Operation} 异步 API 提案

AWS SDK for Java v2 事件流备用语法设计解析:Running{Operation} 异步 API 提案 【免费下载链接】aws-sdk-java-v2 The official AWS SDK for Java - Version 2 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-sdk-java-v2 事件流(Event…

📰

Storybook MDX 文档专用页(Documentation-only Page)完整实战指南:用 Meta Doc Block 构建独立文档与组件文档

Storybook MDX 文档专用页(Documentation-only Page)完整实战指南:用 Meta Doc Block 构建独立文档与组件文档 导读 本文聚焦 Storybook 中一种高频且易混淆的 MDX 文档用法:仅包含 Meta Doc Block 的文档专用页(Doc…

📰

Claude Code生态审计:Skill安全与资源库治理

1. 为什么盯上 awesome-claude-code:一次资源库审计的起点我有个习惯,每隔一段时间就会把 GitHub 上和自己技术栈相关的热门仓库翻出来做一次"静态工程审阅"。这里的"审阅"不是写 code review 的评论,而是把这个仓库当作…

📰

WNDCLASS 光标加载教程,这次用 TaoToken 让 Codex 走通 hCursor 设置

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

📰

VS Code 远程代码同步:SFTP、Remote-SSH、rsync 三种方案

本地写代码、远程跑程序,这种"两栖"开发方式用过的人应该都有体会:改一行代码,开个终端 scp 一次,来回几次就烦了。尤其是调参数、试错、看日志这种高频迭代的活儿,手动传文件的成本高得离谱,一天…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬