文档
Storybook 文档

参数

参数是用于配置 Storybook 中的故事插件的静态元数据。它们在故事、元数据(组件)和项目(全局)级别指定。

故事参数

ℹ️ 在故事级别指定的参数将覆盖在项目级别和元数据(组件)级别指定的参数。

在故事级别指定的参数仅适用于该故事。它们定义在故事(命名导出)的parameters属性中。

Button.stories.ts|tsx
// Replace your-framework with the framework you are using (e.g., react-webpack5, vue3-vite)
import type { Meta, StoryObj } from '@storybook/your-framework';
 
import { Button } from './Button';
 
const meta: Meta<typeof Button> = {
  component: Button,
};
export default meta;
 
type Story = StoryObj<typeof Button>;
 
export const OnDark: Story = {
  // 👇 Story-level parameters
  parameters: {
    backgrounds: {
      default: 'dark',
    },
  },
};

元数据参数

ℹ️ 在元数据(组件)级别指定的参数将覆盖在项目级别指定的参数。

CSF文件中元数据配置中指定的参数适用于该文件中所有故事。它们定义在meta(默认导出)的parameters属性中。

Button.stories.ts|tsx
// Replace your-framework with the framework you are using (e.g., react-webpack5, vue3-vite)
import type { Meta, StoryObj } from '@storybook/your-framework';
 
import { Button } from './Button';
 
const meta: Meta<typeof Button> = {
  component: Button,
  // 👇 Meta-level parameters
  parameters: {
    backgrounds: {
      default: 'dark',
    },
  },
};
export default meta;
 
type Story = StoryObj<typeof Button>;
 
export const Basic: Story = {};

项目参数

在项目(全局)级别指定的参数适用于 Storybook 中的所有故事。它们定义在.storybook/preview.js|ts文件中默认导出的parameters属性中。

.storybook/preview.ts
// Replace your-renderer with the renderer you are using (e.g., react, vue3)
import { Preview } from '@storybook/your-renderer';
 
const preview: Preview = {
  parameters: {
    backgrounds: {
      values: [
        { name: 'light', value: '#fff' },
        { name: 'dark', value: '#333' },
      ],
    },
  },
};
 
export default preview;

可用参数

Storybook 只直接接受几个参数。

layout

类型:'centered' | 'fullscreen' | 'padded'

默认值:'padded'

指定画布应如何布局故事

  • 居中:将故事居中于画布中
  • 填充:(默认)为故事添加填充
  • 全屏:按原样显示故事,不带填充

options

类型

{
  storySort?: StorySortConfig | StorySortFn;
}

options参数只能在项目级别应用。

options.storySort类型:StorySortConfig | StorySortFn

type StorySortConfig = {
  includeNames?: boolean;
  locales?: string;
  method?: 'alphabetical' | 'alphabetical-by-kind' | 'custom';
  order?: string[];
};
 
type Story = {
  id: string;
  importPath: string;
  name: string;
  title: string;
};
 
type StorySortFn = (a: Story, b: Story) => number;

指定 Storybook UI 中显示故事的顺序。

在指定配置对象时,可以使用以下选项:

  • includeNames:是否在排序算法中包含故事名称。默认为 false
  • locales:排序故事时使用的区域设置。默认为您的系统区域设置。
  • method:要使用的排序方法。默认为 alphabetical
    • alphabetical:按名称以字母顺序排序故事。
    • alphabetical-by-kind:按种类以字母顺序排序故事,然后按名称排序。
    • custom:使用自定义排序函数。
  • order:指定顺序中的故事将首先按指定顺序显示。所有其他故事将随后按字母顺序显示。order 数组可以接受嵌套数组来对二级故事种类进行排序,例如 ['Intro', 'Pages', ['Home', 'Login', 'Admin'], 'Components']

在指定自定义排序函数时,该函数的行为类似于典型的 JavaScript 排序函数。它接受两个要比较的故事并返回一个数字。例如:

(a, b) => (a.id === b.id ? 0 : a.id.localeCompare(b.id, undefined, { numeric: true }));

请参阅指南以获取使用示例。

test

类型

{
  clearMocks?: boolean;
  mockReset?: boolean;
  restoreMocks?: boolean;
  dangerouslyIgnoreUnhandledErrors?: boolean;
}

clearMocks

类型:boolean

默认值:false

类似于 Vitest,当故事卸载时,它将在使用 @storybook/test 中的 fn() 创建的所有间谍上调用 .mockClear()。这将清除模拟历史记录,但不会将其实现重置为默认值。

mockReset

类型:boolean

默认值:false

类似于 Vitest,当故事卸载时,它将在使用 @storybook/test 中的 fn() 创建的所有间谍上调用 .mockReset()。这将清除模拟历史记录并将其实现重置为空函数(将返回 undefined)。

restoreMocks

类型:boolean

默认值:true

类似于 Vitest,当故事卸载时,它将在使用 @storybook/test 中的 fn() 创建的所有间谍上调用 .restoreMocks()。这将清除模拟历史记录并将其实现重置为原始值。

dangerouslyIgnoreUnhandledErrors

类型:boolean

默认值:false

未处理的错误可能会导致误报断言。将其设置为 true 将阻止 播放函数 失败并在执行期间抛出未处理的错误时显示警告。


基本插件

所有其他参数都由插件贡献。 基本插件 的参数在其各自的页面上进行了记录。

参数继承

无论参数在何处指定,最终都会应用于单个故事。在项目(全局)级别指定的参数将应用于该项目中的每个故事。在元数据(组件)级别指定的参数将应用于与该元数据关联的每个故事。而为故事指定的参数仅适用于该故事。

在指定参数时,它们将按特定性递增的顺序合并在一起。

  1. 项目(全局)参数
  2. 元数据(组件)参数
  3. 故事参数

ℹ️ 参数是合并的,因此对象是深度合并的,但数组和其他属性会被覆盖。

换句话说,以下参数规范:

// .storybook/preview.js|ts
 
const preview = {
  // 👇 Project-level parameters
  parameters: {
    layout: 'centered',
    demo: {
      demoProperty: 'a',
      demoArray: [1, 2],
    },
  },
  // ...
};
export default preview;
// Dialog.stories.js|ts
 
const meta = {
  component: Dialog,
  // 👇 Meta-level parameters
  parameters: {
    layout: 'fullscreen',
    demo: {
      demoProperty: 'b',
      anotherDemoProperty: 'b',
    },
  },
};
export default meta;
 
// (no additional parameters specified)
export const Basic = {};
 
export const LargeScreen = {
  // 👇 Story-level parameters
  parameters: {
    layout: 'padded',
    demo: {
      demoArray: [3, 4],
    },
  },
};

将导致以下参数值应用于每个故事:

// Applied story parameters
 
// For the Basic story:
{
  layout: 'fullscreen',
  demo: {
    demoProperty: 'b',
    anotherDemoProperty: 'b',
    demoArray: [1, 2],
  },
}
 
// For the LargeScreen story:
{
  layout: 'padded',
  demo: {
    demoProperty: 'b',
    anotherDemoProperty: 'b',
    demoArray: [3, 4],
  },
}