文档
Storybook 文档

useOf

Storybook 提供的默认块无法满足所有用例,因此您可能需要编写自己的块。

如果您的自定义文档块需要与 Storybook 的注释(即故事、元数据或组件)交互,您可以使用 useOf 钩子。传入故事、元数据或组件的模块导出,它将返回其带注释的形式(应用了参数、参数、加载器、装饰器、播放函数),然后您可以将其用于任何您想要的目的。事实上,大多数现有的块,如 DescriptionCanvas,在幕后都使用了 useOf

以下是如何使用 useOf 钩子创建自定义块来显示故事名称的示例

// .storybook/blocks/StoryName.jsx
 
import { useOf } from '@storybook/blocks';
 
/**
 * A block that displays the story name or title from the of prop
 * - if a story reference is passed, it renders the story name
 * - if a meta reference is passed, it renders the stories' title
 * - if nothing is passed, it defaults to the primary story
 */
export const StoryName = ({ of }) => {
  const resolvedOf = useOf(of || 'story', ['story', 'meta']);
  switch (resolvedOf.type) {
    case 'story': {
      return <h1>{resolvedOf.story.name}</h1>;
    }
    case 'meta': {
      return <h1>{resolvedOf.preparedMeta.title}</h1>;
    }
  }
  return null;
};
{/* ButtonDocs.mdx */}
 
import { Meta } from '@storybook/blocks';
import { StoryName } from '../.storybook/blocks/StoryName';
import * as ButtonStories from './Button.stories';
 
<Meta of={ButtonStories} />
 
{/* renders "Secondary" */}
<StoryName of={ButtonStories.Secondary} />
 
{/* renders "Primary" */}
<StoryName />
 
{/* renders "Button" */}
<StoryName of={ButtonStories} />

useOf

类型

(
  moduleExportOrType: ModuleExport | 'story' | 'meta' | 'component',
  validTypes?: Array<'story' | 'meta' | 'component'>
) => EnhancedResolvedModuleExportType

参数

moduleExportOrType

(**必填**)

类型:ModuleExport | 'story' | 'meta' | 'component'

提供故事导出、元数据导出、组件导出或 CSF 文件导出,从中获取注释。

当自定义块位于 附加文档 中时,还可以通过传入字符串来获取主(第一个)故事、元数据或组件。这用作回退,因此可以在块中省略 of 属性。最常见的模式是将其用作 useOf(props.of || 'story'),如果未定义 of 属性,则将回退到主故事。

  • useOf('story') 在附加模式下返回带注释的主故事;在非附加模式下返回错误
  • useOf('meta') 在附加模式下返回带注释的元数据;在非附加模式下返回错误
  • useOf('component') 在附加模式下返回元数据中指定的带注释的组件;在非附加模式下返回错误

validTypes

类型:Array<'story' | 'meta' | 'component'>

可以选择指定一个您的块接受的有效类型的数组。传递任何不是有效类型的内容都会导致错误。例如,Canvas 块使用 useOf(of, ['story']),它确保它只接受对故事的引用,而不是元数据或组件。

返回值

返回值取决于匹配的类型。

EnhancedResolvedModuleExportType['type'] === 'story'

类型:{ type: 'story', story: PreparedStory }

对于故事,带注释的故事按原样返回。它们已准备就绪,这意味着它们已与项目和元数据注释合并。

EnhancedResolvedModuleExportType['type'] === 'meta'

类型:{ type: 'meta', csfFile: CSFFile, preparedMeta: PreparedMeta }

对于元数据,会返回解析后的 CSF 文件,以及准备好的带注释的元数据。也就是说,项目注释与元数据注释合并,但没有故事注释。

EnhancedResolvedModuleExportType['type'] === 'component'

类型:{ type: 'component', component: Component, projectAnnotations: NormalizedProjectAnnotations }

对于组件,会返回组件以及项目注释;没有元数据或故事注释。

请注意,钩子通常无法确定是否传递了组件或任何其他对象,因此它的行为也类似于 unknown 类型。