[Day11] Storybook - Controls

Storybook 有一个很强大的辅具工具 Controls ,它提供一个 GUI 介面让我们可以即时的调整元件的参数,必且会立即在 Canvas 中改变元件的样貌,而且不需在元件中攥写任何的程序码,它会自动根据元件中定义的 props, emitsslots 产生基础的互动介面。

https://i.imgur.com/QV62DCf.gif

不过要使用 Controls 有一个前提,就是需要使用 args 的方式攥写 Story,如果不是用 args 的方式,Controls 产生出来的只会是无法互动的文档而已。

https://ithelp.ithome.com.tw/upload/images/20210926/20113487VNti1cMydU.png

Choosing the control type

预设的情况下,Controls 会根据 Props 的型别和初始值产生对应的控制面板,例如

  • 字串 (string) - 文字输入框
  • 布林值 (boolean) - 开关切换按钮
// src/stories/Button.vue
export default {
  ...
  props: {
    label: {
      type: String,
      required: true,
    },
    primary: {
      type: Boolean,
      default: true,
    }
  }
}

https://ithelp.ithome.com.tw/upload/images/20210926/20113487v7ZcPV8le2.png
但有些情况我们会需要更严谨或是更便利的控制面板,例如下面这个例子。

Button.vue 中有一个 size 属性,型别为字串,且只有在值为 small, medium 或 large 时才有效果,但在预设下,因为 size 的型别是字串,所以控制面板会出现文字输入框让我们操作。

https://i.imgur.com/aH7EOUb.gif

但因为 size 的值其实是有限制的,所以文字输入框对於这样的情境来说并不是最好的控制面板,因此我们可以透过为 size 属性自定义 argTypes 来指定要使用哪种控制面板。

// src/stories/Button.stories.js
export default {
  title: 'Example/Button',
  component: MyButton,
  argTypes: {
    size: {
      control: {
        type: 'select',
        options: ['small', 'medium', 'large']
      }
    }
  }
}ㄥ

https://i.imgur.com/YUclsqF.gif

除了 select 以外还有非常多的 control type 可以设定,这里有一份完整列表可以给大家参考,我就不在这边一一列举了 XD。

Custom control type matchers

如果有自己动手玩玩 Storybook 的朋友一定会发现为什麽 backgroundColor 属性好像没有在做任何设定,但它的控制面板却不是单纯的文字输入框,而是可以带有调色盘的文字输入框。

https://i.imgur.com/pcipPKm.gif

这是因为 Storybook Controls 预设有使用正则表达式针对一些关键字来推断它们,并呈现指定的控制面板,如果我们想要更改它或是新增正规表达式,可以在 preview.js 中的 parameter 下针对 controls.matchers 作设定。

// .storybook/preview.js

export const parameters = {
  controls: {
    matchers: {
      color: /(background|color)$/i,
      date: /Date$/,
    },
  },
};

参考资料


今天的分享就到这边,如果大家对我分享的内容有兴趣欢迎点击追踪 & 订阅系列文章,如果对内容有任何疑问,或是文章内容有错误,都非常欢迎留言讨论或指教的!

明天要来分享的是 Storybook 主题的第五篇 Writing Docs,那我们明天见!


<<:  Day12 [实作] 使用浏览器来拍照并加上滤镜

>>:  sed - 3 Delete command

新需求与架构设计的演进

在前面的二十天中我们完成了基本需求,但是这样的进度在真实的专案中只是刚开始而已,有可能到目前为止做的...

(Day29)第三方套件---图表套件Charts(上)

Charts 官方网站 https://github.com/danielgindi/Charts ...

DAY2-JAVA的变数与资料型态

第一天有讲到变数的部分,今天就让我们来深入了解一下吧! 首先,JAVA的资料型态可以分为原始资料型态...

Kotlin Android 第13天,从 0 到 ML - Activity 和 Activity 生命周期

前言: ConstraintLayout讲完了,画面画好了那是用在那呢? 那就是要放在 Activi...

[Day30] Flutter - App Icon(final)

前言 Hi, 我是鱼板伯爵今天铁人赛的最後一天了感谢大家的支持,不知道大家对这个架构是不是有一点感觉...