reactjs Storybook v7没有在“显示代码”上显示React组件标记

9rbhqvlz  于 5个月前  发布在  React
关注(0)|答案(2)|浏览(70)

我已经看了很长一段时间了,检查了这里类似的帖子,Storybook文档,他们的GitHub帖子等,都没有用。(目前我们使用v7.5.3),文档页面上的“显示代码”选项卡(或者在使用@storybook/addon-storysource插件时,甚至是Story中的Code选项卡)并没有显示React组件的标记,这是故事的一部分。所有显示的都是用于渲染故事的args
以一个非常简单的故事为例,基于一个非常简单的组件(功能性,使用TypeScript):
组件:

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);

字符串
剧情介绍:

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,
};


“显示代码”文档上显示的内容:


的数据
来自main.ts的Sniffer:

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


来自preview.ts的截图:

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


我希望看到生成的React标记,这样其他开发人员就可以复制+粘贴它,如果他们愿意的话。
我错过了什么?

ca1c2owp

ca1c2owp1#

我已经成功地重现了这个案例,看起来你需要做的就是从这里删除type: 'code'来显示JSX代码:

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

字符串

xuo3flqw

xuo3flqw2#

我也遇到了同样的问题,发现像memo这样的装饰函数会破坏类型链,从而无法正确推断属性类型。
请参阅本期以了解更多上下文:https://github.com/storybookjs/storybook/issues/21192
如果我只在一个组件上使用memoforwardRef,它可以在最新版本(7.6.7)上工作,但如果两者都在一个组件上使用,它仍然不适合我。
经过一番折腾,我找到了一种既能解决问题又能解决问题的方法:

export const FormElement = memo<FormElementProps>(forwardRef(FormElementComponent));

字符串
技巧是将props类型作为泛型类型提供给memo
请注意,我只验证了这一点与Vite一起使用,并且该问题还明确提到了Vite,因此Webpack可能会有不同的行为。

相关问题