文件
Storybook 文件

載入器

載入器是異步函式,可為故事及其裝飾器載入資料。故事的載入器會在故事呈現之前執行,而載入的資料會透過其呈現內容注入到故事中。

載入器可用來載入任何資產、延遲載入元件或從遠端 API 提取資料。此功能被設計為效能最佳化,以處理大型故事匯入。不過,建議使用參數來管理故事資料。我們正在建立一個圍繞參數的工具和技術生態系統,這可能與載入的資料不相容。

它們是一項進階功能(即,逸脫機制),我們只建議在您有其他方法無法滿足的特定需求時才使用它們。

提取 API 資料

故事是獨立的元件範例,其會呈現定義為故事一部分或與故事一起作為參數的內部資料。

當您需要從外部載入故事資料(例如,從遠端 API)時,載入器會很有用。請考慮以下範例,該範例會提取要顯示在待辦事項清單中的待辦事項

MyComponent.stories.ts|tsx
import type { Meta, StoryObj } from '@storybook/react';
 
import { TodoItem } from './TodoItem';
 
/*
 *👇 Render functions are a framework specific feature to allow you control on how the component renders.
 * See https://storybook.dev.org.tw/docs/api/csf
 * to learn how to use render functions.
 */
const meta: Meta<typeof TodoItem> = {
  component: TodoItem,
  render: (args, { loaded: { todo } }) => <TodoItem {...args} {...todo} />,
};
 
export default meta;
type Story = StoryObj<typeof TodoItem>;
 
export const Primary: Story = {
  loaders: [
    async () => ({
      todo: await (await fetch('https://jsonplaceholder.typicode.com/todos/1')).json(),
    }),
  ],
};

從遠端 API 呼叫取得的回應會合併到故事內容的 loaded 欄位中,這是故事函式的第二個引數。例如,在 React 中,故事的參數會先展開,以優先於載入器提供的靜態資料。使用其他框架(例如,Angular),您可以像平常一樣撰寫故事。

全域載入器

我們也可以透過您的.storybook/preview.js 檔案的 loaders 匯出,為所有故事設定載入器(這是您設定所有故事的檔案)

.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 = {
  loaders: [
    async () => ({
      currentUser: await (await fetch('https://jsonplaceholder.typicode.com/users/1')).json(),
    }),
  ],
};
 
export default preview;

在此範例中,我們會載入一個「目前使用者」,它以 loaded.currentUser 的形式供所有故事使用。

載入器繼承

參數一樣,載入器可以全域定義、在元件層級定義,以及針對單一故事定義(如我們所見)。

所有載入器,在所有適用於故事的層級定義,都會在故事在 Storybook 的畫布中呈現之前執行。

  • 所有載入器都會並行執行
  • 所有結果都是故事內容中的 loaded 欄位
  • 如果有重疊的索引鍵,「較晚」的載入器優先(從最低到最高)
    • 全域載入器,依定義的順序排列
    • 元件載入器,依定義的順序排列
    • 故事載入器,依定義的順序排列