카테고리 없음

공용컴포넌트 만들어보기

ecoEarth 2023. 8. 10. 06:47

공용컴포넌트 만들어보기(카카시하기)

프로젝트중 팀원분이 공용으로 쓰이는 HTML, CSS를 묶어 컴포넌트화시킨것을 보고 따라해봤다.

원리는 어렵지는 않았지만, 여러곳에서 쓰이는 컴포넌트를 쉽게 사용할 수 있게 해주는 아이디어가 좋아보였다.

팀원분은 flex에 자주 쓰이는 설정들이나 공용에서 쓰이는 버튼같은 것들을 따로 묶어 컴포넌트화하셨는데 나도 마침 로그인페이지에 적용할 구실이 생겨서 연습해봤다.

(태진님 좋은 기술 전파해주셔서 감사함다.)

 

우선, 나는 회원가입/로그인페이지에서 쓰일 비슷비슷하지만 조금씩은 다른 버튼컴포넌트가 필요했다.

색상이랑, border-round만 다른거아냐?? 싶으시겠지만, 폰트크기나 색 그리고 font-bold처리도 약간약간씩 달랐다;

로그인페이지밖에 안쓰이지만, 로그인페이지가 단계로따지면 7~8단계로 세세하게 구성되어있기때문에 거의 7~8페이지에 쓰이기때문에 이런식으로 처리해주면 좋을 것 같았다. (사실 단계가 더 적었어도 연습하려고 어떻게든 구실을 찾아냈을거임)

 

공용컴포넌트 정의

"use client";
import { MouseEventHandler, ReactNode } from "react";

interface ButtonProps {
  children: ReactNode | string;
  size?: "sm" | "md";
  color?: "green" | "white" | "silver";
  round?: "sm" | "md";
  disabled?: boolean;
  className?: string;
  onClickAction?: MouseEventHandler<HTMLButtonElement>;
}

const sizes = {
  sm: "h-[54px]",
  md: "h-[58px]",
};
const colors = {
  green: "bg-[#0ABE7D] text-[18px] text-white font-bold text-center",
  white: "bh-white text-[18px] border-[1px] border-[#E9EBED] text-center",
  silver: "bg-[#E9EBED] text-[18px] text-[#A0A4A8] font-bold text-center",
};
const rounded = {
  sm: "rounded-[10px]",
  md: "rounded-[30px]",
};

export default function SocialButton({
  children,
  size = "md",
  color = "green",
  disabled = false,
  round = "sm",
  className = "",
  onClickAction = () => console.error("onClick 이벤트가 정의되지 않았습니다."),
}: ButtonProps) {
  const sizeClass = sizes[size];
  const colorClass = colors[color];
  const disabledClass = disabled && "opacity-50 cursor-not-allowed";
  const roundedClass = rounded[round];

  return (
    <button
      className={`w-[400px] ${sizeClass} ${colorClass} ${disabledClass} ${className} ${roundedClass}`}
      onClick={onClickAction}
      disabled={disabled}
    >
      {children}
    </button>
  );
}

 

공용컴포넌트 사용

 

 

  • 장점: 테일윈드의 최대단점인 지저분해보이는 코드를 깔끔하게 처리해주고(사실 세세하게 설정이 나뉘면 똑같이 지저분해보이긴 함;)
  • 단점: 자기가 저렇게 작성해놓고도 어떤걸 Prop으로 내려줘야 내가 원하는 모양이 나오게 하지..? 하며 순간 헷갈릴 수 있다;