๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

FrontEnd/React

[React] Styled Component ํ™œ์šฉํ•ด์„œ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ ํ•œ ํ›„๊ธฐ

 

๐Ÿคฉ React Styled Component๋ฅผ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ

1. ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ์„œ ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ๋ž€ ์ •์˜๊ฐ€ ๋ฌด์—‡์ผ๊นŒ์š” ?? 

๋ง ๊ทธ๋Œ€๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฐœ๋… ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ?

 

1. ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด์ค€๋‹ค.

2. ์ข€ ๋” ๊น”๋”ํ•œ ์ฝ”๋“œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ์ง€๋งŒ , ์ €๋Š” ๊ทธ๋™์•ˆ ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

2. ๊ทธ๋™์•ˆ ๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งฐ๋‚˜ ??

์‚ฌ์‹ค ์žฌ์‚ฌ์šฉ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ผ ! ๋ผ๋Š” ๋ง์€ ๋ธ”๋กœ๊ทธ๋‚˜ , ์œ ํŠœ๋ธŒ ์˜์ƒ ๋“ฑ์„ ํ†ตํ•ด์„œ ์ถฉ๋ถ„ํžˆ ์ธ์ง€ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ , 

ํ‰์†Œ์— ์ œ๊ฐ€ ์งœ๋Š” ์ฝ”๋“œ๋Š” ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

๋จธ๋ฆฌ์†์œผ๋กœ ์ธ์ง€๋Š” ํ•˜๊ณ  ์žˆ์ง€๋งŒ , ๋ง‰์ƒ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ์ด๊ณณ ์ €๊ณณ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๊ณ  , ์•ž์œผ๋กœ ๋˜‘๊ฐ™์ด ๋น„์Šทํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‚˜์™€๋„ ๋‹ค์‹œ CSS ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ์žˆ๋Š” ์ œ ์ž์‹ ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

๋น„์Šทํ•˜์ง€๋งŒ ์ค‘๋ณต์ด ์ผ์–ด๋‚œ ๋ฒ„ํŠผ

๊ทผ๋ฐ ํ•œ ๋‘๋ฒˆ์ด ์•„๋‹ˆ๋ผ ์„ธ๋ฒˆ ๋„ค๋ฒˆ ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์น˜๋‹ค๋ณด๋‹ˆ๊นŒ ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. 

์–ด ? ์ด๊ฑฐ ๋˜‘๊ฐ™์€ ์ „์— ์ง  ๊ฑฐ๋ž‘ ๋””์ž์ธ๋„ ๊ทธ๋ ‡๊ณ  ๋น„์Šทํ•œ๊ฑฐ ๊ฐ™์€๋ฐ...? 

๊ทธ๋Ÿฌ๋ฉด ๋”ฐ๋กœ ์ปดํฌ๋„ŒํŠธ๋กœ ๋นผ์„œ ์ƒ‰๊น”์ด๋ž‘ ํฌ๊ธฐ , ์ด๋Ÿฐ ๊ฒƒ๋“ค๋งŒ ๋”ฐ๋กœ ๋„˜๊ฒจ์„œ ๊ณ„์† ์“ธ ์ˆœ ์—†์„๊นŒ ? ๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ  

๊ทธ๋™์•ˆ ๋ดค๋˜ , ๋ธ”๋กœ๊ทธ๋‚˜ , ์œ ํŠœ๋ธŒ ์ง€์‹๋“ค์ด ๋ชจ์•„์ ธ์„œ ์ง์ ‘ ๋งŒ๋“ค์–ด ๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ 

์ผ๋‹จ ๋ฒ„ํŠผ๋“ค์„ ๋ณด๋ฉด์„œ ์ƒ๊ฐํ•œ๊ฒŒ ์„ธ๋กœ , ๊ฐ€๋กœ , ๋ฐฐ๊ฒฝ์ƒ‰ , ๊ธ€์ž์ƒ‰ , ๊ธ€์”จ ํฌ๊ธฐ , ์ด ์ •๋„๋งŒ ์ปค์Šคํ…€ ํ•  ์ˆ˜ ์žˆ์–ด๋„ ์ค‘๋ณต์ด ๋ฐฉ์ง€๋˜๊ฒ ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.  ๊ทธ๋Ÿฌ๋ฉด ์ผ๋‹จ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  , ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ผ๋ฉด Props๋กœ ๋ฌด์—‡์„ ๋ฐ›์„ ์ง€ ์ •์˜๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

interface์— ? ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•  ๋•Œ widht๋‚˜ height ๊ฐ™์€ ์†์„ฑ๊ฐ’๋“ค์„ ์•ˆ ์ค„ ์ˆ˜ ๋„์žˆ๋Š”๋ฐ ๊ทธ๋•Œ ? ๊ฐ€ ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค ! 

interface PropsType {
  width?: string;
  height?: string;
  bgColor?: string;
  color?: string;
  fontSize?: number;
  children?: string;
  weight?: string;
  onClick?: () => void;
}

๊ทธ๋ฆฌ๊ณ  CustomButton ์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์•ˆ์—์„œ ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Button์„ ๋ฆฌํ„ด์„ ํ•ด์ค๋‹ˆ๋‹ค.

function CustomButton(props: PropsType) {
  return <Button {...props}>{props.children}</Button>;
}

export default CustomButton;

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฒ„ํŠผ ์ด๋ฆ„์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฃผ๋ฉด ๊ทธ ๋ฒ„ํŠผ์ด๋ฆ„์ด {props.chidren} ์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ ์ด๋ฆ„์— ๋”ฑ ๋งž๊ฒŒ ๋ฉ๋‹ˆ๋‹ค ! 

<CustomButton>๋ฒ„ํŠผ์ด๋ฆ„</CustomButton>

๊ทธ๋ฆฌ๊ณ  {...props} ๋ถ€๋ถ„์€ ์ €ํฌ๊ฐ€ props๋กœ ๋ฐ›์€ ์†์„ฑ๋“ค์„ ์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์ค๋‹ˆ๋‹ค.  

Button StyledComponent ๋ถ€๋ถ„ 

const Button = styled.button<PropsType>`
  border: none;
  margin: 1rem;
  border-radius: 1rem;
  cursor: pointer;
  font-weight: ${(props) => (props.weight ? props.weight : '400')};
  width: ${(props) => (props.width ? props.width : '12rem')};
  height: ${(props) => (props.height ? props.height : '6rem')};
  font-size: ${(props) => (props.fontSize ? props.fontSize : '1.5rem')};
  background-color: ${(props) => (props.bgColor ? props.bgColor : 'white')};
  color: ${(props) => (props.color ? props.color : 'black')};

  &:hover {
    transform: scale(0.98);
  }
`;

๋งŒ์•ฝ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด styled.button<Type๋„ฃ์–ด์ฃผ์„ธ์š”!> ์ €ํฌ๊ฐ€ ์œ„์—์„œ ์ •์˜ํ–ˆ๋˜ interface ํƒ€์ž…์„ ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค ! 

๊ทธ๋ฆฌ๊ณ   ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋กœ ๋„˜์–ด์˜จ props ์†์„ฑ๋“ค์ด props์— ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ทธ props๋ฅผ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ์•ฝ props.์†์„ฑ๊ฐ’ ์ด ์žˆ์œผ๋ฉด ๋ฐฐ๊ฒฝ์ƒ‰ ๋…ธ๋ž‘์ƒ‰ , ์—†์œผ๋ฉด ํŒŒ๋ž‘์ƒ‰ ์ด๋Ÿฐ์‹์œผ๋กœ ์†์„ฑ๊ฐ’์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฉด ์œ„ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•œ ์˜ˆ์‹œ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค !! 

<CustomButton
      height="4rem"
      bgColor="#5de0e6"
      color="white"
      width="18rem"
      weight="bold"
 >
  Login
</CustomButton>

์ด๋Ÿฐ์‹์œผ๋กœ ์†์„ฑ๊ฐ’์„ ์ฃผ๊ณ  , ๊ทธ์•ˆ์— chidren ๊ฐ’์„ ์ฃผ๋ฉด ๋‹ค๋ฅธ ์ฝ”๋“œ์—์„œ๋„ ๊ณ„์† ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ! 

 

๐Ÿš€ ๊ฒฐ๊ณผ ! 

์ด๋ฒˆ์— ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋‹ˆ๊นŒ ์–ด๋–ค์‹์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ์ด ์žกํžŒ๊ฑฐ ๊ฐ™๊ณ  , 

์•ž์œผ๋กœ ๋ฌด์ž‘์ • CSS๋กœ ์ฐ์–ด๋‚ด๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋‚ด๊ฐ€ ๋งŒ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฏธ๋ž˜์— ๋˜ ์“ฐ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€ ? ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ์ถ”๊ฐ€์ ์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ์ง€ ? ์ƒ๊ฐ์„ ํ•œ๋ฒˆ ๋” ํ•ด๋ณด๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค !