Storybook Controls 面板:按属性禁用控件(table.disable 与 control:false 详解)

发布时间:2026/11/12 12:36:35

Storybook Controls 面板:按属性禁用控件(table.disable 与 control:false 详解) Storybook Controls 面板按属性禁用控件table.disable 与 control:false 详解本文基于 Storybook 官方文档中 Controls 面板的Disable controls for specific properties特性展开系统讲解如何在单个组件属性上关闭 Controls 控件argTypes中table: { disable: true }的完整多框架用法React、Vue、Svelte、Angular、Web Components含 CSF 3 与 CSF Next 两种写法它与control: false的关键区别以及在 Story 级应用的更细粒度模式。文末结合仓库源码Title.tsx、ArgsTable.tsx说明该配置在 Manager 与 Docs 两处 UI 中的实际过滤逻辑帮助你在编写 Story 时做出正确的隐藏决策。一、背景为什么需要按属性禁用 ControlsControls 是 Storybook 中用于实时编辑 Story 属性args的官方 Addon它与 Docs 共用同一套渲染引擎——因此 Controls 面板本质上是一个内嵌的Controlsdoc block即 ArgsTable 的一种形态。这意味着每个属性在面板中对应一行行内同时包含可交互的控件输入框、下拉、颜色选择器等属性的文档信息描述、默认值、表格行。当你希望某个属性对使用者只读例如内部透传的id、调试用的__testMode或文档已单独说明的私有属性时就需要单独关掉这个属性的控件。Storybook 提供了两条正交的配置路径配置位置写法效果argTypes.foo.table.disabletable: { disable: true }从 Controls 面板 UI 中完全移除该属性的控件行同时从文档表格中移除该属性行argTypes.foo.controlcontrol: false保留文档行描述/默认值仍展示但该行没有可交互控件两条路径都定义在 Story 文件的默认导出meta中且都可以在单个 Story 上覆盖与 decorators 等其它 Storybook 特性相同的meta 定义、story 覆盖层级模式。二、禁用单个属性控件table.disable: true下面的示例都针对一个想从 UI 中移除的属性foo来自官方文档代码片段 component-story-disable-controls.md并按框架整理。React / 通用 TypeScriptCSF 3// 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 { YourComponent } from ./YourComponent; const meta { component: YourComponent, argTypes: { // foo is the property we want to remove from the UI foo: { table: { disable: true, }, }, }, } satisfies Metatypeof YourComponent; export default meta;要点argTypes.foo只写table.disable不写control、options等其它字段satisfies Metatypeof YourComponent提供类型检查但不丢失字面量类型是 TS 项目推荐的声明方式。JavaScript 项目无 TS的等价写法import { YourComponent } from ./YourComponent; export default { component: YourComponent, argTypes: { // foo is the property we want to remove from the UI foo: { table: { disable: true, }, }, }, };Vueimport type { Meta } from storybook/your-framework; import YourComponent from ./YourComponent.vue; const meta { component: YourComponent, argTypes: { foo: { table: { disable: true }, }, }, } satisfies Metatypeof YourComponent; export default meta;Angularimport type { Meta } from storybook/angular; import { YourComponent } from ./your-component.component; const meta: MetaYourComponent { component: YourComponent, argTypes: { // foo is the property we want to remove from the UI foo: { table: { disable: true, }, }, }, }; export default meta;SvelteSvelte 框架下既有传统的 CSF 3 文件式写法也有 Svelte CSF 的script module写法// Replace your-framework with svelte-vite or sveltekit import type { Meta } from storybook/your-framework; import YourComponent from ./YourComponent.svelte; const meta { component: YourComponent, argTypes: { // foo is the property we want to remove from the UI foo: { table: { disable: true, }, }, }, } satisfies Metatypeof YourComponent; export default meta;script module import { defineMeta } from storybook/addon-svelte-csf; import YourComponent from ./YourComponent.svelte; const { Story } defineMeta({ component: YourComponent, argTypes: { // foo is the property we want to remove from the UI foo: { table: { disable: true, }, }, }, }); /scriptWeb ComponentsWeb Components 没有 docgencomponent直接写标签名字符串export default { component: your-component, argTypes: { // foo is the property we want to remove from the UI foo: { table: { disable: true, }, }, }, };import type { Meta } from storybook/web-components-vite; const meta: Meta { component: your-component, argTypes: { foo: { table: { disable: true, }, }, }, }; export default meta;CSF Next实验语法下的等价写法在采用 CSF Next 实验特性官方代码块标注为 CSF Next 的项目中meta 不再使用export default而是通过preview.meta()工厂函数生成配置结构完全一致import preview from ../.storybook/preview; import { YourComponent } from ./YourComponent; const meta preview.meta({ component: YourComponent, argTypes: { // foo is the property we want to remove from the UI foo: { table: { disable: true, }, }, }, });Vue / Svelte / Web Components 的 CSF Next 版本写法相同只是component字段按各自框架填组件引用或标签名。该语法当前仍处于实验阶段仓库文档中通过独立的 CSF Next 代码块 Tab 提供生产项目请确认所用 Storybook 版本支持后再切换。三、与 control: false 的关键区别保留文档行官方 controls 文档 在展示table.disable的 UI 变化后特别指出上面的示例同时把该属性的文档从表格中移除了。多数场景这样没问题但如果你希望没有控件、仍保留属性文档描述/默认值应改用control: false对应片段为 component-story-disable-controls-alt.mdimport type { Meta } from storybook/your-framework; import { YourComponent } from ./YourComponent; const meta { component: YourComponent, argTypes: { // foo is the property we want to remove from the UI foo: { control: false, }, }, } satisfies Metatypeof YourComponent; export default meta;对比总结场景推荐写法属性完全不该出现在 Controls 面板 / Args 表格中内部属性、透传属性table: { disable: true }属性文档要保留例如说明该值由运行时注入但禁止手动修改control: false只针对某个 Story 生效其它 Story 仍可编辑在单个 Story 的argTypes中覆盖见下一节注意两者作用域table.disable影响的是 Controls 面板与 Docs 中 ArgsTable 的行级展示它不是运行时过滤——组件渲染时该属性依然会按 args 正常传入只是 UI 层不再展示对应的编辑行。四、在 Story 级应用同一模式与 decorators、parameters 等其它 Storybook 属性一致argTypes支持meta 定义、story 覆盖的层级结构因此可以在单个 Story 上做更细粒度的禁用import type { Meta, StoryObj } from storybook/your-framework; import { YourComponent } from ./YourComponent; const meta: Metatypeof YourComponent { component: YourComponent, }; export default meta; type Story StoryObjtypeof meta; // 只在 Debug 这个 Story 中隐藏 foo 的控件 export const Debug: Story { argTypes: { foo: { table: { disable: true }, }, }, };这样Primary等其它 Story 仍能看到并编辑foo而DebugStory 中该行被移除适合某个变体中该属性无意义的情况。五、源码级实现table.disable 在哪里被消费仓库源码印证了第二节的两种行为差异核心过滤点有两处Manager 侧 Controls 面板标题的计数。Controls 面板头部会显示当前可用控件数量其计数逻辑在 Title.tsxconst rows useArgTypes(); const controlsCount Object.values(rows).filter( (argType) argType?.control !argType?.table?.disable ).length;即一个 argType 被计入控件必须同时满足显式拥有controlcontrol为false时argType.control为 falsy自然被排除且table.disable不为真。这解释了为什么table.disable的属性从面板计数与 UI 中消失而control: false的属性只是没控件但行还在。Docs 侧 ArgsTable 的行过滤。Docs 的 ArgsTable 在渲染行时执行 ArgsTable.tsx 中的过滤(row) !row?.table?.disable safeIncludeConditionalArg(row, args || {}, globals || {})这里table.disable为真的行被直接剔除与 Controls 面板的title.disable表现一致而同一表达式中的safeIncludeConditionalArg则处理 Controls 的if条件控制见 controls 文档Conditional controls小节说明属性行过滤是 Controls 与 Docs 共用的引擎能力。可以推断由于两处过滤共享同一份 argTypes 解析结果table.disable的效果在 Controls 面板与 Docs 页面的 Args 表格中是同步的——这正是官方文档用一段视频展示UI 前后变化的原因文档中引用的演示视频为 addon-controls-disable-specific-prop-optimized.mp4。六、相关能力include/exclude 过滤与排序如果需求是隐藏一大批属性而非单个属性controls 文档 在 Filtering controls 小节提供了更高层的controls参数方案可选的include/exclude字段接受字符串数组或正则表达式可全局或按 Story 定义。两者可组合使用——include/exclude处理批量过滤table.disable/control: false处理精确到单个属性的展示控制。此外同一文档还说明 Controls 的排序策略默认按 args 数据处理顺序none也支持按属性名字母序alpha或必填项优先requiredFirst可在 meta 的controls参数中配置。七、小结移除某属性在 Controls 面板中的控件行与文档行argTypes.foo.table.disable true只移除控件、保留属性文档argTypes.foo.control false需要在单个 Story 生效把同样的argTypes片段写在 Story 导出上批量过滤用controls参数的include/exclude字符串数组或正则单属性精确控制用上述两种 argTypes 写法源码层面table.disable分别在 Title.tsx 的控件计数与 ArgsTable.tsx 的行过滤中被消费验证了 Controls 与 Docs 共用行级过滤机制。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/8 15:55:08

AI视觉防拍屏技术评测与选型指南

1. 项目背景与行业痛点屏幕信息泄露已成为企业数据安全的头号威胁之一。根据Verizon《2023年数据泄露调查报告》,约23%的内部数据泄露事件源于屏幕被拍照或录像。传统防截屏方案主要依赖系统API拦截,但面对智能手机拍照这种"物理层攻击"完全失…

2026/11/11 1:38:01

Copilot替代与AI编程助手选型:免费、付费、本地部署实操指南

1. 需求拆解:到底是谁在找 Copilot 的替代工具聊 Copilot 替代工具这件事,我一般是先问一句"你为什么要换",而不是上来就甩工具清单。原因很简单,市面上能叫得上名字的 AI 编程助手少说二十来个,免费的一抓一…

2026/11/11 1:26:57

Qwen3.8 27B本地部署:Ollama量化与16G显存调优实战

Qwen3.8 这个 27B 版本放出来那天,我第一时间就把权重拖回了本地。原因很简单,我手头有一批内部文档要做结构化整理,涉及合同条款和代码片段,这些东西丢到在线接口里转一圈,心里总归不踏实。本地部署大语言模型这件事我…

2026/11/12 12:35:56

宝坻验电工证电话千万别踩坑,新手怎么避坑全在这了

宝坻验电工证电话千万别踩坑,新手怎么避坑全在这了 你不知道去哪报名怕被中介坑?别慌,这期内容专为宝坻地区准备,带你一步步搞清楚【宝坻验电工证电话】到底怎么找、怎么避坑,尤其是那些藏在细节里的“套路”和“坑”,我全都告诉你。…

2026/11/12 12:35:56

2022电工证换证别走弯路,含金量高的证书怎么考

2022电工证换证别走弯路,含金量高的证书怎么考 不知道去哪报名怕被中介坑?2022年电工证换证政策变动不少,很多人因为信息不对称,花了冤枉钱还拿不到证。其实只要掌握好流程,避开套路,含金量高的电工证也能轻松搞定。下面我从洛阳涧西区市政公用…

2026/11/12 12:35:56

曹县在哪里办电工证官方报名入口在哪怎么找

曹县在哪里办电工证官方报名入口在哪怎么找 工地太忙根本没时间复习考试,曹县电工证到底怎么考?很多人在工地干活,手里活儿干不完,脑子里想着怎么把电工证给办了,但一想到考试、复习这些事,就头大。今天我就从一个干了多年特种作业培训的老手角度,给你…

2026/11/12 12:35:56

浦北电工证快速拿证通过率揭秘:如何避开中介陷阱,一步到位

浦北电工证快速拿证通过率揭秘:如何避开中介陷阱,一步到位 不知道去哪报名怕被中介坑?浦北电工证快速拿证到底靠不靠谱?别急,先听我说说真实情况。去年三门峡某项目现场,有位电工小李因为走了“捷径”,结果不仅花了冤枉钱,还耽误了工期。现在他每次提…

2026/11/12 12:35:55

延安宝塔区电工证保姆级教程:外省证能不能转过来?一文搞懂

延安宝塔区电工证保姆级教程:外省证能不能转过来?一文搞懂 之前考的证在外省能不能转过来?这个问题我每天都能听到,特别是像你这样在延安宝塔区想从事电工工作的朋友。别急,今天这波保姆级教程,就是让你明明白白知道该怎么操作,怎么转,怎么考,怎么用…

2026/11/12 12:30:55

茂名化州电工证考证怕考不过白交培训费?电子证书怎么拿?

茂名化州电工证考证怕考不过白交培训费?电子证书怎么拿? 你花了几千块报名,结果一考试就挂,培训费打了水漂,这事儿太常见了。尤其是茂名化州电工证考证,很多人在报名前都没搞清楚流程,结果浪费了时间和金钱。别急,本文就给你讲明白怎么考,怎么拿…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

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

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

2026/11/12 9:51:42

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
免费获取方案
☎咨询二维码 ☎ ↑