控制項

在 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-controls 中沒有的各種選項。

因此,我們不會立即棄用 addon-knobs,而會繼續在 7.0 版本之前與 Storybook 核心發行一起發布 knobs。這會給我們時間根據使用者回饋改進控制項,並讓 knobs 使用者有充足的時間遷移。

如果您因某種原因綁定到 knobs 或更喜歡 knobs 介面,我們很樂意接受 knobs 專案的維護者。如果您對此感興趣,請在 #contributing Discord 頻道中與我們聯繫。

如何從 addon-knobs 遷移?

如果您已經在使用 Storybook Knobs,您應該考慮遷移到控制項。

您可能將它用於可以滿足上述情況之一的功能。

讓我們逐步了解兩個範例:將knobs 遷移到自動產生的參數,以及將knobs 遷移到自訂參數

首先,讓我們考慮一個 knobs 版本的基本故事,該故事會填入元件的 props

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

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

這會根據 knob 填入 Button 的標籤,這與上述自動產生的使用案例完全相同。因此,我們可以改用自動產生的參數來重寫它

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}`} />
      ))}
    </>
  );
};

同樣地,如上所述,這可以使用完全自訂的參數來重寫

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,
    },
  },
};

我的控制項沒有自動產生。我該怎麼辦?

在某些已知的情況下,無法自動產生控制項

  • 您使用的框架不支援自動產生
  • 您嘗試為在外部程式庫中定義的元件產生控制項

只需少量的人工操作,您仍然可以在這種情況下使用控制項。請看以下範例

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 提供在這些不支援的情況下產生控制項所需的提示。請參閱控制項註解,以取得控制項類型的完整清單。

您的 Storybook 也可能設定錯誤。如果您認為可能是這種情況,請搜尋 Storybook 的 Github 問題,如果您沒有找到符合您使用案例的問題,請提交新問題。

如何針對特定故事中的特定欄位停用控制項?

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
標籤