React props spread, 어디에 둘 것인가
· 약 3분
shadcn/ui 코드를 보다가 잠깐 멈췄던 부분이 있었다. JSX에서는 뒤에 오는 prop이 앞을 덮어쓴다고 알고 있었는데, Button 컴포넌트는 className을 앞에 두고 {...props}를 뒤에 둔다.
function Button({ className, variant, size, ...props }: ButtonProps) {
return <ButtonPrimitive className={cn(buttonVariants({ variant, size, className }))} {...props} />;
}
처음엔 그냥 이렇게 생각했다.
"어? 이거 사용자가
className넘기면 덮어써지는 거 아냐?"
근데 다시 보니까 애초에 덮어쓸 대상이 없었다. className을 구조 분해로 미리 빼놨기 때문이다.
function Button({ className, ...props }: ButtonProps);
여기서 이미 className은 따로 꺼내졌고, props 안에는 안 들어간다. 그러니까 뒤에서 {...props}를 spread해도 className 충돌 자체가 안 난다.