控件

在 Storybook UI 中动态交互组件输入

在 Github 上查看

Storybook 控件插件

Storybook 控件为您提供了一个图形界面,可以动态交互组件的参数,而无需编写代码。它会在您的组件示例(“故事”)旁边创建一个插件面板,这样您就可以实时编辑它们。

框架支持

Screenshot

安装

控件是 essentials 的一部分,因此默认情况下在所有新的 Storybook 中都已安装。如果您需要将其添加到 Storybook 中,可以运行以下命令

npm i -D @storybook/addon-controls

然后,将以下内容添加到 .storybook/main.js

export default {
  addons: ['@storybook/addon-controls'],
};

用法

用法在 文档 中有说明。

常见问题

这将如何替换 addon-knobs?

Addon-knobs 是 Storybook 最受欢迎的插件之一,每周下载量超过 100 万,因此我们知道许多用户会受到此更改的影响。Knobs 也是一个成熟的插件,具有控件中没有的各种选项。

因此,我们不会立即弃用 addon-knobs,而是在 Storybook 核心分发版中继续发布 knobs,直到 7.0。这将使我们有时间根据用户反馈改进控件,并为 knobs 用户提供充足的时间进行迁移。

如果您以某种方式绑定到 knobs 或更喜欢 knobs 界面,我们很乐意为 knobs 项目接收维护者。如果您对此感兴趣,请在 #contributing Discord 频道联系我们。

如何从 addon-knobs 迁移?

如果您已经在使用 Storybook Knobs,您应该考虑迁移到 Controls。

您可能正在将其用于可以通过 上面描述的 其中一个案例来解决的事情。

让我们逐步介绍两个示例:将 knobs 迁移到自动生成的 args 和将 knobs 迁移到自定义 args

首先,让我们考虑一个基本的填充组件 props 的 knobs 版本的故事

import { text } from '@storybook/addon-knobs';
import { Button } from './Button';

export const Basic = () => <Button label={text('Label', 'hello')} />;

这会根据一个 knob 填充 Button 的标签,这正是上面 自动生成 的用例。因此,我们可以使用自动生成的 args 重写它

export const Basic = (args) => <Button {...args} />;
Basic.args = { label: 'hello' };

类似地,我们还可以考虑一个使用 knob 输入来更改其行为的故事

import { number, text } from '@storybook/addon-knobs';

export const Reflow = () => {
  const count = number('Count', 10, { min: 0, max: 100, range: true });
  const label = text('Label', 'reflow');
  return (
    <>
      {[...Array(count)].map((_, i) => (
        <Button key={i} label={`button ${i}`} />
      ))}
    </>
  );
};

同样,如上所述,可以使用 完全自定义 args 重写它。

export const Reflow = ({ count, label, ...args }) => (
  <>
    {[...Array(count)].map((_, i) => (
      <Button key={i} label={`${label} ${i}`} {...args} />
    ))}
  </>
);

Reflow.args = {
  count: 3,
  label: 'reflow',
};

Reflow.argTypes = {
  count: {
    control: {
      type: 'range',
      min: 0,
      max: 20,
    },
  },
};

我的控件没有自动生成。我该怎么办?

有几个已知的 cases 无法自动生成控件。

通过少量的手动操作,您仍然可以在这些情况下使用控件。考虑以下示例

import { Button } from 'some-external-library';

export default {
  title: 'Button',
  argTypes: {
    label: { control: 'text' },
    borderWidth: { control: { type: 'number', min: 0, max: 10 } },
  },
};

export const Basic = (args) => <Button {...args} />;

Basic.args = {
  label: 'hello',
  borderWidth: 1,
};

argTypes 注释(如果需要,也可以应用于单个故事)为 Storybook 提供了在这些不支持的 cases 中生成控件所需的提示。有关控件类型的完整列表,请参阅 控件注释

您的 Storybook 也可能配置错误。如果您认为可能是这种情况,请在 Storybook 的 Github issues 中搜索,如果您没有找到与您的用例匹配的问题,请创建一个新问题。

如何为特定故事的某些字段禁用控件?

argTypes 注释可用于隐藏特定行的控件,甚至隐藏行。

假设您有一个带有 borderWidthlabel 属性(自动生成或其他)的 Button 组件,并且您希望完全隐藏 borderWidth 行,并在特定故事上禁用 label 行的控件。以下是如何做到这一点

import { Button } from 'button';

export default {
  title: 'Button',
  component: Button,
};

export const CustomControls = (args) => <Button {...args} />;
CustomControls.argTypes = {
  borderWidth: { table: { disable: true } },
  label: { control: { disable: true } },
};

故事参数 一样,argsargTypes 注释是按层次结构合并的,因此故事级别的注释会覆盖组件级别的注释。

控件如何与 MDX 一起使用?

从 CSF 文件将故事导入 MDX 时,控件的工作方式相同。有关示例,请参阅 文档

由以下人员制作
  • domyen
    domyen
  • kasperpeulen
    kasperpeulen
  • valentinpalkovic
    valentinpalkovic
  • jreinhold
    jreinhold
  • kylegach
    kylegach
  • ndelangen
    ndelangen
与以下框架一起使用
    Angular
    Ember
    React
    Vue
    Web Components
标签