프린세스 다이어리

[Storybook] 스토리북 mdx 기본틀 잡기 본문

FE

[Storybook] 스토리북 mdx 기본틀 잡기

개발공주 2022. 1. 28. 23:54
728x90

스토리북 공식문서에 정말 상세하게 잘 나오기는 했으나 필요한 기능을 찾아 조합하는 것은 좀 다른 문젠 것 같다. 가장 단순한 샘플 Button 컴포넌트를 예시로 기록해보겠다.

 

1. 버튼의 props 옵션 선택하는 기능 추가하기

import {ArgsTable, Canvas, Meta, Story} from '@storybook/addon-docs';
import BaseButton from 'common/components/input/BaseButton.vue';

<Meta
    title="Button"
    component={BaseButton}
    argTypes={{
        boxStyle: {
            name: 'Button Style',
            control: {
                type: 'select',
                options: ['block', 'inline-block'],
            },
        },
        theme: {
            name: 'Button Color',
            control: {
                type: 'radio',
                options: ['blue', 'sky', 'grey', 'red', 'pink', 'yellow'],
            },
        },
        size: {
            name: 'Button Size',
            control: {
                type: 'select',
                options: ['medium', 'semi-large', 'large'],
            },
        },
        onClick: {action: 'clicked'},
    }}
/>

Meta > argTypes에 옵션이름 > control > options 에 배열로 기존 컴포넌트에서 props로 넘겨받는 값들을 나열해서 넣어준다. control > type에 select로 지정하면 드롭다운이, radio로 지정하면 라디오 버튼으로 나온다. 라디오 버튼이 선택지를 모두 노출하기 때문에 개인적으로 라디오 버튼을 선호한다. 그렇게 하면 docs에 다음과 같이 나온다.

 

 

2. 클릭 이벤트 찍기

<Meta
    title="Button"
    component={BaseButton}
    argTypes={{
        // ...
        
        onClick: {action: 'clicked'},
    }}
/>

클릭 이벤트 찍는 방법은 다양한데, 그중에 공식문서에서 나오는 방법은 위와 같다. 이렇게 argTypes에 onClick을 작성해 주면 클릭 때마다 다음과 같이 나온다.

 

이 외에도 parameters에 어떤 엘리먼트를 클릭했는지 명확히 하는 방법도 있다. parameters > actions.handles에 'click'과 컴포넌트의 클래스를 작성해주는 방법이다.

<Meta
    // ...
    parameters={{
        actions: {
            handles: ['click .accept-btn'],
        },
    }}
/>

 

또 부모 컴포넌트에 emit 하는 함수를 action에 등록할 수도 있다. 그런데 이건 레거시라고 한다. 개인적으론 이게 더 컴포넌트에서 어떤 함수를 emit하고 있는지 명확히 할 수 있어서 더 좋아 보인다.  https://github.com/storybookjs/storybook/blob/master/addons/actions/ADVANCED.md 

export const Template = (args, {argTypes}) => ({
    components: {BaseConfirm},
    setup() {
        return {args, argTypes};
    },
    template: `<base-confirm v-bind="args" @click="accept" />`,
    methods: {
        accept: action('accept-clicked'),
    },
});

 

3. canvas 뷰포트 설정하기

 

preview.js에서 여러 종류의 viewport를 설정할 수 있다.

export const parameters = {
    viewport: {
        viewports: {
            mobile1: {
                name: 'iPhone 4, 4s',
                styles: {
                    width: '320px',
                    height: '480px',
                },
                type: 'mobile',
            },
            mobile3: {
                name: 'iPhone 6, 6s, 7, 8',
                styles: {
                    width: '375px',
                    height: '667px',
                },
                type: 'mobile',
            },
            mobile4: {
                name: 'iPhone 6+, 6s+, 7+, 8+',
                styles: {
                    width: '414px',
                    height: '736px',
                },
                type: 'mobile',
            },
            mobile5: {
                name: 'iPhone X, XS',
                styles: {
                    width: '375px',
                    height: '812px',
                },
                type: 'mobile',
            },
            // ...
        },
        defaultViewport: 'mobile5',
    },
    // ...
};

parameters.viewport.viewports에 위와 같이 뷰포트 이름, 가로세로 픽셀, 타입 이렇게 정해줄 수 있다. 또 defaultViewport로 스토리북 기본 뷰포트를 설정할 수 있다. 이런 parameter는 이렇게 preview.js에 전역으로 설정해줄 수도 있지만 컴포넌트 독스마다 각기 다른 설정을 해줄 수도 있다.

뷰포트를 커스텀해서 적용한 모습이다.

728x90
Comments