我已经看了很长一段时间了,检查了这里类似的帖子,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标记,这样其他开发人员就可以复制+粘贴它,如果他们愿意的话。
我错过了什么?
2条答案
按热度按时间ca1c2owp1#
我已经成功地重现了这个案例,看起来你需要做的就是从这里删除
type: 'code'
来显示JSX代码:字符串
xuo3flqw2#
我也遇到了同样的问题,发现像
memo
这样的装饰函数会破坏类型链,从而无法正确推断属性类型。请参阅本期以了解更多上下文:https://github.com/storybookjs/storybook/issues/21192
如果我只在一个组件上使用
memo
或forwardRef
,它可以在最新版本(7.6.7)上工作,但如果两者都在一个组件上使用,它仍然不适合我。经过一番折腾,我找到了一种既能解决问题又能解决问题的方法:
字符串
技巧是将props类型作为泛型类型提供给
memo
。请注意,我只验证了这一点与Vite一起使用,并且该问题还明确提到了Vite,因此Webpack可能会有不同的行为。