치춘짱베리굿나이스

classnames 본문

ClientSide/라이브러리

classnames

치춘 2022. 5. 6. 01:27

classnames

설치

$> npm install classnames

npm 링크

classnames

 

classnames

A simple utility for conditionally joining classNames together. Latest version: 2.3.1, last published: a year ago. Start using classnames in your project by running `npm i classnames`. There are 34036 other projects in the npm registry using classnames.

www.npmjs.com

용례

클래스를 여러 개 추가하고자 할 때나 특정 조건에 따라 클래스를 다르게 적용하고 싶을 때 사용하면 간단하게 클래스를 구현할 수 있다

간단한 사용례

import cx from 'classnames'

...
<div className={cx('default-class', 'sub-class')}></div>
// <div class="default-class sub-class"></div>

클래스를 여러 개 붙이고 싶을 때, cx의 인자로 서로 다른 클래스명을 넣어준다

import cx from 'classnames'

...
<div className={cx('aaa', 'bbb', 'ccc', 'ddd')}></div>
// <div class="aaa bbb ccc ddd"></div>

2개 이상도 된다 (가변 인자 가능)

배열로 여러 클래스 한번에 적용하기

import cx from 'classnames'

...
const CLASSARR = ['aaa', 'bbb', 'ccc', 'ddd', 'eee'];
...
<div className={cx(CLASSARR)}></div>
// <div class="aaa bbb ccc ddd eee"></div>

배열 안에 있는 모든 문자열들이 클래스명으로 들어간다

import cx from 'classnames'

...
const CLASSARR = ['aaa', 'bbb', 'ccc', 123, true, false, 0x00ff];
...
<div className={cx(CLASSARR)}></div>
// <div class="aaa bbb ccc 123 255"></div>

boolean은 클래스명으로 들어가지 않고, 숫자는 자동으로 문자열처럼 들어간다

조건부 클래스 적용하기

import cx from 'classnames'

...
<div className={cx('default-class', {sub-class: false})}></div>
// <div class="default-class"></div>

<div className={cx('default-class', {sub-class: true)}></div>
// <div class="default-class sub-class"></div>

조건부 클래스는 객체를 넣어서 적용할 수 있다

valuetrue일 때, key가 클래스로 들어간다

import cx from 'classnames'

...
const [boolState, setBoolState] = useState(false);
const [numState, setNumState] = useState(0);
...
<div className={cx('default-class', {sub-class: boolState})}></div>
<div className={cx('default-class', {sub-class: numState > 0)}></div>

상태값이나 각종 연산값들을 가지고도 참 / 거짓에 따라 클래스명을 적용할 수 있다

import cx from 'classnames'

...
<div className={cx('default-class', {sub-class: undefined})}></div>
<div className={cx('default-class', {sub-class: null)}></div>

undefinednullfalse와 같이 동작한다 (클래스명 적용 X)

응용하기

import cx from 'classnames'

...
const [isClicked, setIsClicked] = useState(false);
...
const handleClickBtn = () => {
    setIsClicked((prevState) => !prevState)
}
...
<div className={cx('default-class', {'btn-clicked': isClicked})}></div>
<button onClick={handleClickBtn}>
    버튼이요
</button>

핸들러와 상태값을 적절히 사용하여 다른 요소의 동작에 따라 클래스명을 다르게 적용할 수도 있다

물론 객체에 값을 여러 개 넣을 수 있으므로 잘 쓴다면 클래스를 헷갈리지 않게 예쁘게 넣을 수 있다

value 값에는 boolean을 반환하는 함수를 넣어도 된다

CSS Module과 같이 사용하기

import cx from 'classnames'

import styles from './Testfile.module.scss'

...
<div className={cx(styles.divWrapper, {[styles.divClicked]: isClicked}></div>

CSS Moduler과 같이 사용하면 클래스명 고유값 설정과 classnames의 중복 클래스명 설정의 편리함을 둘 다 누릴 수 있다

styles.<클래스명> 과 같은 형식은 key 이름 설정이 불가능하므로 대괄호로 묶어주거나 classnames.bind를 사용하자

classnames.bind

import cx from 'classnames/bind'

import styles from './Testfile.module.scss'

const binded = cx.bind(styles);
...
<div className={cx('divWrapper'}></div>

bind를 이용하여 앞에 styles 등의 스타일명을 붙일 필요 없이 클래스명만 문자열으로 사용 가능하다

장점

간단한 프로젝트면 몰라도 규모가 큰 프로젝트는 조건부로 클래스명을 중복 적용하기가 복잡하다

객체 형식으로 예쁘게 클래스명과 조건식을 적용할 수 있어 가독성을 높여준다

코드는 가독성이 짱이다

참고자료

classnames 패키지 사용법

 

classnames 패키지 사용법

✔️ 필요성 서로 다른 효과를 가진 css 코드를 하나의 컴포넌트에 병합해서 적용할 때 사용한다. array[ ] 로도 병합이 가능하지만 true/false boolean을 이용해서 특정 효과를 적용할 지 적용하지 않을

sezzled.tistory.com

 

'ClientSide > 라이브러리' 카테고리의 다른 글

React-Beautiful-Dnd  (0) 2022.05.15
lodash  (0) 2022.05.14
store  (0) 2022.05.12
react-modal  (0) 2022.03.24
Styled Components  (0) 2022.03.24
Comments