加入直播:周四,美国东部时间上午11点,Storybook 9 发布& AMA

Docs Tabs

一个 Storybook 插件,为 Docs 插件添加选项卡。

在 Github 上查看

storybook-addon-docs-tabs

一个 Storybook 插件,为 Docs 插件添加选项卡。

注意:这个插件有点取巧。Storybook API 本身并不支持这样的功能。但你仍然可以使用这个插件,因为它依然使用了 mdx 及其“正常”的 API。

入门

1. 安装

npm install --save-dev storybook-addon-docs-tabs
# yarn add -D storybook-addon-docs-tabs

2. 在 .storybook/preview.js 中添加新的容器

import { DocsContainer } from "@storybook/addon-docs/blocks";
import { TabContainer } from "storybook-addon-docs-tabs";

export const parameters = {
  docs: {
    container: ({ children, context }) => (
      <DocsContainer context={context}>
        <TabContainer context={context}>{children}</TabContainer>
      </DocsContainer>
    ),
  },
};

2. 在 .storybook/manager-head.html 中隐藏侧边栏的 Tab 故事

<style>
  [id^="hidden"],
  [data-parent-id^="hidden"] {
    display: none !important;
  }
</style>

3. 在 .storybook/tsconfig.json 中添加 jsx

可选:如果你尚未配置 jsx

{
  "extends": "../tsconfig.app.json",
  "compilerOptions": {
    "jsx": "react"
  }
}

4. 在 .storybook/.babelrc 中添加 react preset

可选:如果你尚未配置 jsx

{
  "presets": [["@babel/react", { "runtime": "automatic" }]]
}

在故事中使用

设置故事的 id

不幸的是,由于 Storybook API 的限制,这是必要的。任何唯一的字符串都可以用作 id。

给故事标题加上 hidden/ 前缀以在侧边栏中隐藏它。

import { Meta } from "@storybook/addon-docs";

<Meta
  id="simple-button-implementation"
  title="hidden/SimpleButtonImplementation"
  component={TestComponent}
/>

导入 Tabs

import { Meta } from "@storybook/addon-docs";
import * as DesignTab from "./design-tab.stories.mdx";
import * as ImplementationTab from "./implementation-tab.stories.mdx";

<Meta
  title="Example/Tab Example"
  parameters={{
    tabs: [
      { label: "Design", mdx: DesignTab },
      { label: "Implementation", mdx: ImplementationTab },
    ],
  }}
/>

添加头部 CTA 和底部

你可以扩展 TabContainer,添加自定义行动号召和自定义底部,它们会显示在每个页面上。

属性 输入类型 描述
footerElement JSX.Element 在每个页面底部显示你的组件
additionalHeaderElement JSX.Element 在头部标题旁边显示你的组件

示例

{container: ({ children, context }) => (
  <DocsContainer context={context}>
    <TabContainer
      context={context}
      footerElement={<Footer />}
      additionalHeaderElement={<Header />}
    >
      {children}
    </TabContainer>
  </DocsContainer>
)},