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

Storybook:如何为子组件传递独立参数并通过控件修改

如何在Storybook中为Accordion.Item子组件传递独立属性并可视化控制

要让Storybook UI能直接控制每个Accordion.Item的独立属性(比如size),不用手动写死属性值,有两种实用方法:

方法一:为每个子组件单独定义args属性

直接在Story的args里给每个Item新增独立属性,比如item1Size、item2Size,Storybook会自动在Controls面板生成对应的控件,然后在render里把这些属性绑定到对应的子组件上。

修改后的代码示例:

export const AlternativesSizes: TStory = {
  args: {
    spacing: 'sm',
    variant: 'alternative',
    hasBackgroundColor: true,
    // 给每个子组件添加独立可控属性
    item1Size: 'large',
    item2Size: 'small'
  },
  render: (args) => (
    <Accordion {...args}>
      <Accordion.Item
        id="story-17"
        title="这个折叠面板尺寸为large"
        size={args.item1Size}
      >
        <Text>
          这是折叠面板#1的展开内容。{' '}
          <i>
            你可以使用各种HTML <sup>标签</sup>{' '}
          </i>
          <b>
            甚至可以添加链接
          </b>
          <br />
          <ul>
            <li>支持列表等多种元素</li>
            <li>支持列表等多种元素</li>
            <li>支持列表等多种元素</li>
          </ul>
        </Text>
      </Accordion.Item>
      <Accordion.Item
        id="story-18"
        title="这个折叠面板尺寸为small"
        size={args.item2Size}
      >
        这是折叠面板#2的展开内容
      </Accordion.Item>
    </Accordion>
  ),
  // 可选:手动配置控件类型,让UI更友好
  argTypes: {
    item1Size: {
      control: 'select',
      options: ['small', 'medium', 'large'],
      description: '第一个折叠面板的尺寸'
    },
    item2Size: {
      control: 'select',
      options: ['small', 'medium', 'large'],
      description: '第二个折叠面板的尺寸'
    }
  }
};

方法二:用数组统一管理所有子组件配置

如果需要控制的子组件数量较多,直接把所有Item的配置放到args的数组里,这样批量管理更方便,render时通过循环渲染子组件即可。

代码示例:

export const DynamicItems: TStory = {
  args: {
    spacing: 'sm',
    variant: 'alternative',
    hasBackgroundColor: true,
    items: [
      { 
        id: 'story-17', 
        title: '面板1', 
        size: 'large', 
        content: (
          <Text>
            这是折叠面板#1的展开内容。{' '}
            <i>
              你可以使用各种HTML <sup>标签</sup>{' '}
            </i>
            <b>
              甚至可以添加链接
            </b>
            <br />
            <ul>
              <li>支持列表等多种元素</li>
              <li>支持列表等多种元素</li>
              <li>支持列表等多种元素</li>
            </ul>
          </Text>
        )
      },
      { 
        id: 'story-18', 
        title: '面板2', 
        size: 'small', 
        content: '这是折叠面板#2的展开内容' 
      }
    ]
  },
  render: (args) => (
    <Accordion {...args}>
      {args.items.map(item => (
        <Accordion.Item
          key={item.id}
          id={item.id}
          title={item.title}
          size={item.size}
        >
          {item.content}
        </Accordion.Item>
      ))}
    </Accordion>
  ),
  argTypes: {
    items: {
      control: 'object',
      description: '所有折叠面板的配置集合'
    }
  }
};

两种方法的适用场景:

  • 方法一适合子组件数量少的情况,每个属性对应独立控件,操作直观;
  • 方法二适合子组件数量多的场景,便于统一管理和批量修改。

内容的提问来源于stack exchange,提问作者Gaspar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:25:55