文件
Storybook 文件

文件區塊

觀看影片教學

Storybook 提供數個文件區塊,協助您記錄元件和專案的其他方面。

在 Storybook 中使用文件區塊有兩種常見方式:在 MDX 中以及作為文件頁面範本的一部分。

在 MDX 中

這些區塊最常在 Storybook 的 MDX 文件中使用

Screenshot of mdx content

{/* ButtonDocs.mdx */}
 
import { Meta, Primary, Controls, Story } from '@storybook/blocks';
import * as ButtonStories from './Button.stories';
 
<Meta of={ButtonStories} />
 
# Button
 
A button is ...
 
<Primary />
 
## Props
 
<Controls />
 
## Stories
 
### Primary
 
A button can be of primary importance.
 
<Story of={ButtonStories.Primary} />
 
A button can be of secondary importance.
 
<Story of={ButtonStories.Secondary} />
 
{/* ... */}

自訂自動文件頁面

這些區塊也用於定義自動文件的頁面範本。例如,這是預設範本

Screenshot of automatic docs template

import { Title, Subtitle, Description, Primary, Controls, Stories } from '@storybook/blocks';
 
export const autoDocsTemplate = () => (
  <>
    <Title />
    <Subtitle />
    <Description />
    <Primary />
    <Controls />
    <Stories />
  </>
);

如果您覆寫預設頁面範本,您可以類似地使用文件區塊,為您的專案建立完美的文件頁面。

請注意,某些文件區塊會渲染其他區塊。例如,<Stories /> 區塊會展開為

## Stories
 
<Canvas>
  ### Story name
  <Description />
  <Story />
  <Source />
</Canvas>
 
{/* ... repeat <Canvas> for each story */}

因此,舉例來說,透過參數 (請參閱下一節) 自訂Source 區塊也會影響渲染為 Canvas 區塊一部分的 Source 區塊。

自訂文件區塊

在這兩種使用案例 (MDX 和自動文件) 中,許多文件區塊都可以透過參數進行自訂。

例如,您可以透過 Storybook 從所有 Controls 表格中篩選掉 style 屬性

.storybook/preview.ts
// Replace your-framework with the framework you are using (e.g., react, vue3)
import { Preview } from '@storybook/your-framework';
 
const preview: Preview = {
  parameters: {
    docs: {
      controls: { exclude: ['style'] },
    },
  },
};
 
export default preview;

參數也可以在元件 (或 meta) 層級或 Story 層級定義,讓您可以根據需要精確地自訂文件區塊。

在以下可用的區塊清單中,會標示可透過參數自訂的區塊。

在 MDX 中使用文件區塊時,也可以使用其 props 進行自訂

<Controls exclude={['style']}>

可用的區塊

每個區塊都有專用的 API 參考頁面,詳細說明使用方式、可用的選項和技術細節。

ArgTypes

接受命名空間 parameters.docs.argTypes 中的參數。

ArgTypes 區塊可用於顯示指定元件的參數類型的靜態表格,以記錄其介面。

Screenshot of ArgTypes block

畫布 (Canvas)

接受命名空間 parameters.docs.canvas 中的參數。

畫布 (Canvas) 區塊是 故事 (Story) 的包裝器,具有一個工具列,可讓您與其內容互動,同時自動提供所需的 原始碼 (Source) 片段。

Screenshot of Canvas block

調色盤 (ColorPalette)

調色盤 (ColorPalette) 區塊可讓您記錄整個專案中使用的所有顏色相關項目(例如,色票)。

Screenshot of ColorPalette and ColorItem blocks

控制項 (Controls)

接受命名空間 parameters.docs.controls 中的參數。

控制項 (Controls) 區塊可用於顯示指定故事的引數的動態表格,作為記錄其介面的方法,並允許您更改(單獨)呈現的故事的引數(透過 故事 (Story)畫布 (Canvas) 區塊)。

Screenshot of Controls block

描述 (Description)

描述 (Description) 區塊會顯示從元件、故事或其各自的 JSDoc 註解取得的中繼資料的描述。

Screenshot of Description block

圖示庫 (IconGallery)

圖示庫 (IconGallery) 區塊可讓您快速記錄與專案相關聯的所有圖示,並以整潔的網格顯示。

Screenshot of IconGallery and IconItem blocks

Markdown

Markdown 區塊可讓您在 MDX 檔案中匯入和包含純文字 markdown。

Screenshot of Markdown block

中繼資料 (Meta)

中繼資料 (Meta) 區塊用於附加自訂的 MDX 文件頁面,以及元件的故事列表。它不會呈現任何內容,但在 MDX 檔案中有兩個用途

  • 將 MDX 檔案附加到元件及其故事,或
  • 控制側邊欄中未附加的文件項目的位置。

主要 (Primary)

主要 (Primary) 區塊會在 故事 (Story) 區塊中顯示主要(在故事檔案中第一個定義的)故事。它通常會直接在文件條目的標題下呈現。

Screenshot of Primary block

原始碼 (Source)

接受命名空間 parameters.docs.source 中的參數。

原始碼 (Source) 區塊用於直接呈現原始碼片段。

Screenshot of Source block

故事集 (Stories)

故事集 (Stories) 區塊會呈現故事檔案中的完整故事集合。

Screenshot of Stories block

故事 (Story)

接受命名空間 parameters.docs.story 中的參數。

故事(元件測試)是 Storybook 的基本構建模組。

在 Storybook 文件中,您可以使用 故事 (Story) 區塊,在 MDX 檔案的內容中呈現 CSF 檔案中的任何故事,並套用所有註解(參數、引數、載入器、裝飾器、播放函式)。

Screenshot of Story block

副標題

Subtitle 區塊可以用作您文件條目的次要標題。

Screenshot of Subtitle block

標題

Title 區塊作為您文件條目的主要標題。它通常用於提供元件或頁面的名稱。

Screenshot of Title block

排版

Typeset 區塊有助於記錄您專案中使用的字體。

Screenshot of Typeset block

無樣式

Unstyled 區塊是一個獨特的區塊,它會停用 Storybook 在 MDX 文件中添加的預設樣式。

預設情況下,文件中的大多數元素(如 h1p 等)都會應用一些預設樣式,以確保文件看起來良好。但是,有時您可能希望某些內容不應用這些樣式。在這些情況下,請使用 Unstyled 區塊包裝內容以移除預設樣式。

Screenshot of Unstyled block

建立您自己的文件區塊

Storybook 還提供了一個 useOf hook,使您更容易建立功能與內建區塊類似的自訂區塊。

疑難排解

為什麼我無法在我的 stories 中使用文件區塊?

Storybook 的文件區塊是高度可自訂且有用的建構區塊,可協助您建立自訂文件。儘管它們中的大多數都允許您使用參數或全域方式自訂它們以建立自訂的文件範本,但它們主要是為 MDX 檔案設計的。例如,如果您嘗試將 ColorPalette 區塊添加到您的 stories 中,如下所示,則當 story 在 Storybook 中載入時,您會收到錯誤訊息。

MyComponent.stories.ts|tsx
// Replace your-framework with the name of your framework
import type { Meta, StoryObj } from '@storybook/your-framework';
 
import { ColorItem, ColorPalette } from '@storybook/blocks';
 
import { MyComponent } from './MyComponent';
 
const meta: Meta<typeof MyComponent> = {
  component: MyComponent,
};
 
export default meta;
type Story = StoryObj<typeof MyComponent>;
 
const theme = {
  colors: {
    primaryDark: {
      value: '#1C1C1C',
    },
    primaryRegular: {
      value: '#363636',
    },
    primaryLight1: {
      value: '#4D4D4D',
    },
    primaryLight2: {
      value: '#878787',
    },
    primaryLight3: {
      value: '#D1D1D1',
    },
    primaryLight4: {
      value: '#EDEDED',
    },
  },
};
 
// ❌ Don't use the Doc Blocks inside your stories. It will break Storybook with a cryptic error.
export const Colors: Story = {
  render: () => (
    <ColorPalette>
      {Object.entries(theme.colors).map(([key, { value }]) => (
        <ColorItem
          colors={{
            [key]: value,
          }}
          key={key}
          subtitle={`theme.colors.${key}`}
          title={key}
        />
      ))}
    </ColorPalette>
  ),
};

深入了解 Storybook 文件