有条件地启用 Storybook 控件

Posted

技术标签:

【中文标题】有条件地启用 Storybook 控件【英文标题】:Enable a Storybook control conditionally 【发布时间】:2021-05-21 08:09:44 【问题描述】:

我在故事中使用控件来查看组件的不同状态。 有些道具只有在启用了其他道具时才有意义。

例如,我有 3 个道具:

isEmployee - 布尔值 isActive - 布尔值 canContactInTheWeekend - 布尔值

这里,canContactInTheWeekend 仅在 isActivetrue 时适用。 为了让开发人员更清楚,我想在isActivefalse 时禁用canContactInTheWeekend 切换。

如何使用标准 Storybook 设置或通过一些插件来实现它?

【问题讨论】:

【参考方案1】:

这个问题正是 Flare 的动机,Flare 是 Storybook Knobs 和 Storybook Controls 的原则性替代方案。以下是我将如何使用 Flare 实现您的示例:

pipe(
  of((isEmployee: boolean) => (otherProps:  isActive: boolean, canContactInTheWeekend: boolean ) => (<Contact ... isEmployee, ...otherProps  />)),
  ap(checkbox( label: "Employee", initial: false )),
  ap(
    pipe(
      switch_( label: "Active", initial: false ),
      chain(ifElse(
        pipe(
          checkbox( label: "Weekend OK", initial: false ),
          map(canContactInTheWeekend => ( isActive: true, canContactInTheWeekend ))
        ),
        of( isActive: false, canContactInTheWeekend: false )
      ))
    )
  )
)

这是一个完整的工作演示:https://codesandbox.io/s/gifted-paper-ulqrg?file=/src/main.tsx:719-1276

有关 Flare 的更多信息,请查看https://flare.js.org/

请注意,我是作者。

【讨论】:

【参考方案2】:

我假设您已经在使用 addon-knobs https://storybook.js.org/addons/@storybook/addon-knobs。

你应该能够像这样实现你想要的:

export const Default = () => 
    const isActive = boolean('isActive ', false);
    const canContactInTheWeekend = isActive ?  boolean('canContactInTheWeekend ', false) : false;

return (<.../>)

更详尽的例子:https://stephencharlesweiss.com/conditional-storybook-knobs/

【讨论】:

旋钮已替换为Controls。我相信 OP 正在使用控件。 @jorisw 这个问题是在他们正式弃用旋钮之前的几个月被问到的。我邀请您添加一个带有控件的示例,因为我还没有机会尝试它们。 我想,不幸的是控件不支持它,因此与旋钮相比有点回归。

以上是关于有条件地启用 Storybook 控件的主要内容,如果未能解决你的问题,请参考以下文章

@storybook/addon-controls:如何不为某个道具自动生成控件

Storybook:更改控件的值不会重新呈现 Chart.js 画布

如何在 Storybook 中添加样式道具作为控件?

如何在 Storybook 的控件插件中获得下拉菜单?

如何有条件地隐藏部分 WPF 控件?

如何有条件地更改数据绑定 WPF ListView 的 CellTemplate 中控件的属性?