Today I Learned/REACT

[REACT] Class Variance Authority

YES_developNewbie 2024. 9. 27. 04:29

CVA(Class Variance Authority)는 수많은 UI 컴포넌트를 일일이 작성하지 않고 함수처럼 재사용성을 고려해 유지보수성, 개발 속도를 증가시켜주는 라이브러리이다. 

 

1. install

npm i class-variants-authority

 

2. base

cva 함수의 첫번째 인자로 base가 들어간다. 기본적으로 들어가는 스타일링을 설정해줄 수 있다.

const buttonVariant = cva(" text-black font-bold " // base, 
	...
});

 

3. variants

cva 함수의 두번째 인자로 객체가 들어가는데, 객체 안의 첫번째 키로 variants를 지정해줄 수 있다.

variants 지정을 통해 재사용성이 높고 일정한 UI 컴포넌트를 개발할 수 있다.

const buttonVariant = cva("", {
	variants: {
		size: {
			sm: "px-2 py-2 text-sm font-medium",
			md: "px-2.5 py-2 text-base font-semibold border border-black",
		},
		intent: {
			primary: "bg-black",
			kakao: "bg-yellow-400",
		},
		outline: {
			true: "bg-white border",
			false: "text-white",
		},
		rounded: {
			none: "rounded-none",
			sm: "rounded-sm",
			md: "rounded-md",
			lg: "rounded-lg",
		},
	},
	...
});

size, intent, outline, rounded 키를 지정하였고 키에 대응하는 밸류값에 따라 스타일링을 설정하도록 작성하였다.

 

4. compoundVariants

compoundVariants는 두번째 인자인 객체에서 두번째 키값으로, 특정 variants를 조합했을 때 추가적으로 대응되는 스타일링을 적용시켜줄 수 있다. 이를 통해 더 재사용성이 높고 스타일링 자유도가 높은 컴포넌트를 개발할 수 있다.

const buttonVariant = cva(
	...
	compoundVariants: [
		{
			outline: true,
			intent: "primary",
			className: "border-black text-black",
		},
	],
    ...
});

 

위 코드에서는 outline이 true 이고 intent가 primary일 때 border-black과 text-black이 적용되는 코드이다.

 

5. defaultVariants

defaultVariants는 컴포넌트가 호출되었을 때 기본값으로 설정되는 variants를 작성하는 부분이다. 이를 통해 일일이 작성하지 않아도 기본값이 설정되어 속도 있는 개발이 가능하다

const buttonVariant = cva(
	...
	defaultVariants: {
		size: "md",
		intent: "primary",
		outline: false,
		rounded: "sm",
	},
});

 

6. 컴포넌트 props 타입 지정

원래는 props로 값을 받기 때문에 아래와 같이 일일이 타입 선언을 해주어야 했다.

interface ButtonProps = {
    size: {
        sm: string;
        md: string;
    };
    intent: {
        primary: string;
        kakao: string;
    };
    outline: {
        true: string;
        false: string;
    };
    rounded: {
        none: string;
        sm: string;
        md: string;
        lg: string;
    };
}

 

하지만 CVA를 활용해 위에 선언한 buttonVariant 변수를 기반으로 자동으로 타입 선언을 해줄 수 있다.

type ButtonVariant = VariantProps<typeof buttonVariant>;