className 속성에 대한 스타일 지정은 매우 간단하지만, ‘고정 스타일과 선택 스타일이 혼재된 경우’, ‘선택해야 할 스타일이 여러 개에 걸쳐 있는 경우’에는 {…} 표현식이 복잡해지기 쉽다는 문제가 있다.
이러한 번거로움을 피하기 위해 classnames라는 라이브러리를 도입하는 것이 좋으며, classnames 라이브러리는 터미널에서 다음 명령어로 설치할 수 있다.
npm install classnames
https://github.com/JedWatson/classnames
import React from 'react';
import cn from 'classnames';
export default function Button (props) {
return (
<button
className={cn('foo', 'bar')}
>
클릭
</button>
);
}
사용법은 classnames 라이브러리에서 가져온 cn 함수에 적용할 스타일 클래스 이름을 나열하기만 하면 된다. 해 공백이 빠지는 등의 문제가 발생하지 않아 코드를 작성하기가 훨씬 수월해졌다.
또한, 문자열과 객체를 혼합한 다음과 같은 서술도 가능하다.
import React from 'react';
import cn from 'classnames';
export default function Button (props) {
return (
<button
className={cn(
'foo',
{
light: mode === 'light'
dart: mode === 'dark'
}
)}
>
클릭
</button>
);
}
객체는 ‘스타일명: boolean 값’ 형식으로 표현하여, 값이 true인 스타일만 적용한다는 의미다. 여러 스타일을 각각 분기별로 켜고 끌 때 유용한 구문이다.
또는 다음과 같이 문자열/배열/객체의 혼합도 가능하다.
import React from 'react';
import cn from 'classnames';
export default function Button (props) {
return (
<button
className={cn(
'foo',
[
'bar',
{
light: mode === 'light'
dart: mode === 'dark'
}
]
)}
>
클릭
</button>
);
}
이 예시에서는 중첩된 배열이 평탄화되어 ‘foo bar light’와 같은 속성 값이 생성된다.
이처럼 classnames 라이브러리를 이용하면 className 값 생성의 표현력이 향샹되므로 className 속성의 분기로 인해 코드가 복잡해졌다고 생각되면 도입을 고려해볼 수 있다.
참고: 따라하며 쉽게 배우는 모던 리액트 완벽 입문
'Frontend > React.js' 카테고리의 다른 글
[React]useImmer 라이브러리 사용법 (0) | 2025.01.04 |
---|---|
[React]state를 업데이트를 위한 두 가지 방법 (1) | 2024.12.29 |
[React] 문자열로 이루어진 태그를 페이지에 반영하는 법 (0) | 2024.12.18 |
[React] Redux-toolkit 사용법 (0) | 2024.08.13 |
[React] useEffect, useLayoutEffect - sideEffect 훅 (0) | 2024.08.13 |