描述问题
我正在使用最新版本的storybook,版本号为7.0.20。我使用的是vite+vue预设。我有一个组件,并且为它编写了故事,但是自动推断的argTypes效果不佳:
虽然有事件,但我在Actions
面板中看不到任何日志。为了查看日志,我需要手动编写:
const meta: Meta<typeof Editor> = {
component: Component,
argTypes: {
onReady: {},
},
}
现在,有了日志,但是Controls
面板看起来不太正常:
我认为,自动推断的argTypes应该是这样的:
{
ready: {
table: {
category: 'events'
}
}
}
也许我们可以改进它,让parameters.actions.argTypesRegex: "^on[A-Z].*"
能够自动捕获所有事件。
重现方法
- 无响应*
系统信息
- 无响应*
其他上下文信息
- 无响应*
4条答案
按热度按时间kcugc4gi1#
我为SB文档模块创建了一个自定义的
extractArgTypes
,以改进我项目中的许多类型,特别是与TS相关的。其中一个改进是将事件设置到属性on{EventName}
上。如果#22285被合并,这里的许多更改都将得到改善/提高,但我认为这个问题不会得到解决。检查
extractArgTypes
函数:storybook/code/renderers/vue/src/docs/extractArgTypes.ts
在d07bfc5的第63行至第75行
| | argTypes[name]={ |
| | name, |
| | description: descriptions.replace('undefined',''), |
| | defaultValue: {summary: defaultSummary}, |
| | type: { required, ...sbType}asSBType, |
| | table: { |
| | type: {summary: definedTypes}, |
| | jsDocTags: tags, |
| | defaultValue: {summary: defaultSummary}, |
| | category: section, |
| | }, |
| | control: {disable: !['props','slots'].includes(section)}, |
| | }; |
它仍然有相同的名称。
如果你想创建PR来修复这个问题,更改将在以下链接中:https://github.com/storybookjs/storybook/blob/next/code/renderers/vue/src/docs/extractArgTypes.ts#L74
xjreopfe2#
当我在使用Storybook v7时,我没有感到惊讶,但在v8中,尽管Vue支持得到了改进,这个问题仍然存在。我困惑于它最初是如何被设计的。
重述问题:
然后:
someEvent
现在,如果我们尝试手动声明这个事件:
fn()
,action
,或者在argTypes
下声明,都能成功触发一个动作(从阅读文档中我不清楚哪个版本更优)someEvent
属性,TypeScript会报错;只有on
SomeEvent
satisfies Meta<typeof Component>
所以,似乎
onSomeEvent
被正确推断出来了,因此具有类型安全性。如果是这样的话,那么:someEvent
而不是onSomeEvent
没有被渲染到"Events"面板?argTypesRegex: '^on[A-Z].*'
没有效果?(见编辑后的评论)如果这个问题还没有被打开的话,我本以为我犯了一个非常低级的错误。
编辑: 在重新阅读原始的工单后,我意识到我描述的问题并没有改变。
argTypesRegex
确实按预期工作。如果我按照原始工单中描述的方式定义argTypes: { onSomeEvent: { } }
(如注解所提到的),Storybook会自动分配一个动作。那么,我现在提出的唯一新问题是,类型安全期望事件前缀为
on
,而推断则是发现并分配没有这个前缀的事件。一旦推断修复了,这就不再是问题了。gijlo24d3#
让我尝试澄清一些困惑。TLDR,你是对的 :)
Storybook 作为一个 Vue
h
调用,所以对于以下组件:在底层只是调用了
h
函数:将事件前缀为
on
的习惯来自 Vue 本身,参见:所以我认为你是对的,我们需要确保我们的 docgen 分析在推断出的 argTypes 是事件时,用
on
进行前缀。WDYT @larsrickert@chakAs3 ?ars1skjm4#
我认为你是对的,我们需要确保我们的docgen分析在事件的情况下为推断出的argTypes添加前缀
on
。WDYT @larsrickert@chakAs3 ?我不确定这是否正确,因为那时事件会显示在表格中的
on
前缀中,这是不正确的,因为在使用vue组件时,没有on前缀:所以使用
@on-some-event
实际上是无效的。因此,仅在Storybook内部需要(如果需要的话)on前缀。但是,我同意这很令人困惑,因为正确的事件名称是“someEvent”,但它需要定义为
onSomeEvent
。我们在当前项目中也遇到了同样的问题,我们创建了自己的函数来定义事件,该函数将定义onSomeEvent
作为操作,但将其隐藏在表格中,只向用户显示someEvent
。我想如果事件能自动记录/定义为操作,那么主要问题就会解决,这样就不需要定义argType了,对吗?