지난 챕터에서는 스토리북에 대해 알아보고 설치 방법과 스토리북을 실제로 작동시켜보았다.
이번 챕터에서는 story들을 작성해보고 사용해보자.
스토리북은 말 그대로 story라는 것들을 하나의 책처럼 모아둔 애플리케이션이라고 할 수 있다.
각각의 스토리들은 컴포넌트의 시각적 상태를 보여준다. 우리의 역할은 리액트 애플리케이션에서 각각의 상태에 맞는 스토리를 작성하는 것이다.
버튼의 스토리를 직접 작성해보자.
우리는 스토리를 작성할 때 총 세 개의 파일이 필요하다.
첫 번째는 컴포넌트 파일이다. 우리의 케이스에선 button 컴포넌트를 의미한다.
두 번째는 버튼 컴포넌트와 관련된 스타일이 작성된 파일이다.
세 번째가 바로 컴포넌트와 일치하는 스토리 파일이다.
일단 이 세 개의 파일을 한 폴더에 묶어서 관리해 볼 것이다.
src 폴더 밑에 components
폴더 그리고 밑에 Button이라는 폴더를 만든다.
그리고 Button.css
, Button.js
, Button.stories.js
파일을 생성한다.
하나의 폴더에 관리하니까 조직적인 느낌이 강한데 앱이 더 커지면 어떨지는 아직 모르겠다. 디렉토리 구조를 잘 설계할 필요성이 느껴진다..
버튼 컴포넌트를 만들어보자.
먼저 두 개의 클래스를 갖는데 variant는 props로 전달받는다. 또한 children도 사용하는 컴포넌트에서 전달받는 방식으로 해서 재사용성을 높여준다.
import React from 'react';
import './Button.css';
const Button = (props) => {
const { variant = 'primary', children, ...rest } = props;
return (
<>
<button className={`button ${variant}`} {...rest}>
{children}
</button>
</>
);
};
export default Button;
button 클래스와 더불어 4개의 클래스를 추가해보자.
.button {
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
border-radius: 4px;
cursor: pointer;
}
.primary {
background-color: #008cba;
}
.secondary {
background-color: #e7e7e7;
}
.success {
background-color: #4caf50;
}
.danger {
background-color: #f44336;
}
드디어 스토리를 작성해보자.
component story format 이라는 형식으로 작성해 볼 것이다. 이 형식은 export default
를 가지고 하나 또는 이상의 export
를 갖는다.
import React from 'react';
import Button from './Button';
export default {
title: 'Button',
};
객체 형태를 export default
하는데 title
이라는 프로퍼티를 의무적으로 써줘야한다. 이 타이틀은 리액트 애플리케이션 전체에서 유니크해야한다. 또한 title
은 storybook 애플리케이션 좌측 네비게이션 패널에 렌더링된다.
두 번째는 component
프로퍼티이다.
export default {
title: 'Button',
component: Button,
};
import한 버튼 컴포넌트를 적어주면 된다. 필수 프로퍼티는 아니다. 하지만 addon과 의존 관계를 갖기 때문에 적어주는게 좋다.
위에서 작성한 default문에는 story에 대한 정보들을 작성해두었다. 이 export에서는 구체적인 네임으로 리액트 컴포넌트를 export 한다. 여기서 export 하는 것들이 스토리를 대표한다.
우리는 이 버튼 스토리에서 variant에 따라 버튼이 어떻게 시각화되는지를 알고 싶다. 위에서 작성한 네 가지 경우에 대해서 작성해보자.
export default {
title: 'Button',
component: Button,
};
export const Primary = () => <Button variant="primary">Primary</Button>;
export const Secondary = () => <Button variant="secondary">Secondary</Button>;
export const Success = () => <Button variant="success">Success</Button>;
export const Danger = () => <Button variant="danger">Danger</Button>;
다 작성했으면 yarn storybook
export문으로 작성한 컴포넌트들이 왼쪽 패널에 네비게이션으로 나타나는 걸 확인할 수 있다.
스토리북의 동작을 정리해보자.
터미널에 yarn storybook
을 입력하면 .storybook
에 있는 main.js
로 진입한다.
아마 웹팩설정과 관련이 있을거 같다. 일단 지금은 정확하진 않다.
아무튼 main.js
에서 웹팩이 하는 것처럼 파일명들을 확인하고 그 파일에 맞는 파일을 찾아간다.
stories 파일의 엔트리 포인트인 export default
객체를 확인하고 타이틀을 확인하여 계층구조를 만든다.
다음으로는 구체적인 네이밍으로 export
된 컴포넌트들을 확인하고 props와 children등 컴포넌트에 실제로 필요한 정보들을 넘겨준다. 그리고 그런 정보들을 import
된 컴포넌트에 넣어주게 된다.
그렇게되면 컴포넌트가 불려지고 css가 입혀지게 된다. 동작원리는 간단하다!
다음 편에서는 스토리 계층에 대해 알아보자.