You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Storybook v7/v8展示代码页不显示React组件标记求助

Storybook v7/v8 文档页「Show code」仅展示args,不显示React组件标记的问题

自升级至Storybook v7再到v8后,文档页的「Show code」标签不再显示故事对应的React组件JSX标记,仅展示用于渲染故事的args。已查阅相关帖子、Storybook文档及GitHub内容,未找到解决方法。

以下是示例代码及配置:

组件代码

import classNames from 'classnames';
import { memo, MouseEvent } from 'react';

import { decapitalizeFirstLetter } from '@helpers/stringHelper';

import { PadlockIcon } from '@icons';

import styles from './AccessControlIndicator.less';
import Msg from './AccessControlIndicator.msg';
import { Access } from './types';

function AccessControlIndicator({
    access,
    className,
    'data-testid': testId = 'AccessControlIndicator',
    displaySurround = false,
    isReadOnly = false,
    onClick,
}: {
    access: Access;
    className?: string;
    'data-testid'?: string;
    displaySurround?: boolean;
    isReadOnly?: boolean;
    onClick?: (e: MouseEvent) => void;
}) {
    let icon = null;

    switch (access) {
        case Access.None:
        case Access.Restricted:
        case Access.RestrictedAuto:
            icon = <PadlockIcon className={styles.icon} />;
            break;
        case Access.All:
        default:
            icon = null;
            break;
    }

    return (
        <button
            className={classNames(
                styles.root,
                displaySurround && styles.surround,
                isReadOnly && styles.readOnly,
                className,
            )}
            data-state={access}
            data-testid={testId}
            disabled={isReadOnly}
            onClick={!isReadOnly ? onClick : undefined}
        >
            {icon}
            <span className={styles.label}>
                <Msg s="label" />
            </span>
            <span className={styles.access}>
                <Msg s={decapitalizeFirstLetter(access)} />
            </span>
        </button>
    );
}

export default memo(AccessControlIndicator);

Story代码

import { Meta, StoryObj } from '@storybook/react';

import AccessControlIndicator from './AccessControlIndicator';
import { Access } from './types';

const meta: Meta<typeof AccessControlIndicator> = {
    component: AccessControlIndicator,
    title: 'AccessControlIndicator',
    argTypes: {
        access: {
            options: Object.keys(Access),
            mapping: Access,
            control: {
                type: 'inline-radio',
            },
        },
    },
};

export default meta;

type Story = StoryObj<typeof AccessControlIndicator>;

const defaultArgs = {
    access: Access.None,
    displaySurround: false,
    isReadOnly: false,
};

export const Default: Story = {
    args: defaultArgs,
};

当前「Show code」显示效果

Storybook 当前Show code显示效果

配置片段

main.ts

addons: [
    '@storybook/addon-a11y',
    '@storybook/addon-essentials',
    '@storybook/addon-interactions',
    '@storybook/addon-links',
    'storybook-addon-pseudo-states',
    '@storybook/addon-webpack5-compiler-babel'
],
core: {},
docs: {
    autodocs: true,
},
framework: {
    name: '@storybook/react-webpack5',
    options: {
        builder: {
            fsCache: true,
            lazyCompilation: false,
        },
    },
},

preview.ts

docs: {
    source: {
        language: 'tsx',
    },
},

期望能看到生成的React标记,以便其他开发者直接复制使用,请问遗漏了什么配置?


解决方法

方法1:给故事显式添加render函数

在Story文件中,为每个故事定义render函数,直接返回组件的JSX调用代码:

export const Default: Story = {
  render: (args) => <AccessControlIndicator {...args} />,
  args: defaultArgs,
};

添加后,「Show code」会直接展示你在render中编写的JSX代码,而非仅显示args对象。

方法2:修改Preview配置强制切换代码显示模式

在preview.ts的docs.source配置中,添加type: 'code',强制Storybook展示组件的JSX代码,还可以通过transform函数自定义代码生成逻辑:

docs: {
  source: {
    language: 'tsx',
    type: 'code', // 切换到代码显示模式
    // 可选:自定义生成符合业务场景的JSX代码
    transform: (_, storyContext) => {
      const { args } = storyContext;
      return `<AccessControlIndicator
  access={Access.${args.access}}
  displaySurround={${args.displaySurround}}
  isReadOnly={${args.isReadOnly}}
/>`;
    },
  },
},

说明

Storybook v7+ 默认对仅用args定义的故事,会在「Show code」中展示args对象,目的是突出组件的可配置参数。如果需要提供可直接复制使用的JSX代码,上述两种方法都可以实现:

  • 方法1更灵活,适合需要自定义渲染逻辑的场景;
  • 方法2适合批量统一调整所有故事的代码显示格式。

内容的提问来源于stack exchange,提问作者emerson.marini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:46:38