reactjs 故事书可选 prop 力量未定义

jmp7cifd  于 2023-02-08  发布在  React
关注(0)|答案(2)|浏览(100)

我没有找到任何解决我的问题的答案。我正在用Typescript构建一个React Storybook。对于可选的 prop ,Storybook插件添加了一个"未定义"选项。我放置了一个defaultProps,但它不接受它。你有任何解决方案吗?
组件:

type IconType = 'outline' | 'solid'

export interface IconProps {
  name: keyof typeof icons
  size?: number
  type?: IconType
  className?: string
  fallback?:
    | boolean
    | React.ReactChild
    | React.ReactFragment
    | React.ReactPortal
    | null
}

const Icon = ({
  name,
  type = 'solid',
  className = '',
  size = 4,
  fallback = null,
}: IconProps): JSX.Element => {
  if (!name) {
    throw new Error("Can't call Icon component without name props")
  }

  const Icon = React.lazy(
    () => import(`../${type}/${icons[name]}`)
  )

  return (
    <React.Suspense fallback={fallback}>
      <Icon className={className} style={{width: size, height: size}} />
    </React.Suspense>
  )
}

Icon.defaultProps = {
  type: 'solid',
}

export default Icon

故事:

import React from 'react'
import { Story, Meta } from '@storybook/react'
import Icon, { IconProps } from '.'

export default {
  title: 'Components/Icon',
  component: Icon,
} as Meta

const Template: Story<IconProps> = (args) => <Icon {...args} />

export const Basic = Template.bind({})
Basic.args = {
  name: 'plus',
}

它告诉我:

当我选择undefined时,它不使用图标的默认属性😭

nnvyjq4y

nnvyjq4y1#

我也遇到了同样的问题,对我来说,它是这样工作的:

import React from 'react'
import { ComponentStory, ComponentMeta } from '@storybook/react'
import Icon, { IconProps } from '.'

export default {
  title: 'Components/Icon',
  component: Icon,
} as ComponentMeta<typeof Icon>

const Template: ComponentStory<typeof Icon> = (args: IconProps) => <Icon {...args} />

export const Basic = Template.bind({})
export const BasicArgs: IconProps = {
  name: 'plus',
}
Basic.args = BasicArgs

另外,当我试图导出并在其他地方使用这个故事时,它不起作用,因为类型不匹配:我可以通过在中间创建一个名为BasicArgs的附加类型对象,然后将其赋值给Basic.args来解决这个问题。
现在,您可以将其导入到其他位置并按如下方式使用:

import { Basic, BasicArgs } from './Icon.stories'
    
...  (
       <Basic {...BasicArgs} />
    ) ...
abithluo

abithluo2#

当设置故事书文本控件时,它总是返回类型字符串,有时我需要它是未定义的。我找到的一个解决方法是在故事中处理它并覆盖参数。

if (args.label?.length === 0) {
    args.label = undefined;
}

相关问题