[C/F TIL] 46~47์ผ์ฐจ - React Coustom Component

mu-engยท2023๋…„ 6์›” 16์ผ
1

TIL (in boost camp)

๋ชฉ๋ก ๋ณด๊ธฐ
44/53
post-thumbnail

Code States
Front-end boost camp
Today
I
Learned

๐Ÿ‘ 46์ผ์ฐจ ๋ฆฌ์•กํŠธ ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ~? + 47์ผ์ฐจ ๊ณผ์ œ


๐Ÿ‘ CDD

  • Component-Driven Development
  • ๋ ˆ๊ณ ์ฒ˜๋Ÿผ ์กฐ๋ฆฝํ•ด ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ถ€ํ’ˆ ๋‹จ์œ„๋กœ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๋Š” ๊ฐœ๋ฐœ
  • ์ƒํ–ฅ์‹ ๊ฐœ๋ฐœ์— ๊ฐ€๊นŒ์›€

๐Ÿ‘ CSS in JS ํƒ„์ƒ ๋ฐฐ๊ฒฝ

  • CSS ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์กฐํ™”๋œ CSS์˜ ํ•„์š”์„ฑ ๋Œ€๋‘
    -- ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๋‚˜ ๋ณต์žก๋„๊ฐ€ ์ ์  ์ปค์ง€๊ณ  ํ•จ๊ป˜ ์ž‘์—…ํ•ด์•ผ ํ•  ํŒ€์› ์ˆ˜๋„ ๋งŽ์•„์ง
    -- ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค๋“ค์˜ ๋“ฑ์žฅ์œผ๋กœ ๋” ๋ณต์žกํ•ด์ง„ CSS
  • CSS ์ „์ฒ˜๋ฆฌ๊ธฐ(CSS Preprocessor) ๋“ฑ์žฅ
  • SASS(Syntactically Awosome Style Sheets) : CSS๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์–ธ์–ด
    -- ํŠน์ • ์†์„ฑ์˜ ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์—ฌ ํ•„์š”ํ•œ ๊ณณ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ์ ์šฉ
    -- ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ์„ ์–ธ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ณณ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก... ๋“ฑ
    -- SCSS ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์„œ ์ „์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ์ปดํŒŒ์ผ ํ•ด์„œ ์ „์—ญ CSS ๋ฒˆ๋“ค ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ์—ญํ• 
    -- ํ•˜์ง€๋งŒ... ์žฅ์ ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฌธ์ œ์  ๋ฐœ๊ฒฌ

๐Ÿ‘ CSS in JS

  • CSS๋„ ์ปดํฌ๋„ŒํŠธ ์˜์—ญ์œผ๋กœ ๋ถˆ๋Ÿฌ๋“ค์ด๊ธฐ ์œ„ํ•ด ํƒ„์ƒ
  • ๋Œ€ํ‘œ์ ์œผ๋กœ Sytled-Components : ๊ธฐ๋Šฅ์  ํ˜น์€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ๋“ค๋กœ๋ถ€ํ„ฐ UI๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ˆœํ•œ ํŒจํ„ด ์ œ๊ณต
  • CSS ๋ฐฉ๋ฒ•๋ก ๋“ค์˜ ํŠน์ง•, ์žฅ๋‹จ์ 

๐Ÿ‘ Styled-Components

  • React ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • CSS๋ฅผ ์ปดํฌ๋„ŒํŠธํ™” ์‹œํ‚ด์œผ๋กœ์จ CSS ํ™œ์šฉ ์‹œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ถˆํŽธํ•จ ํ•ด๊ฒฐ
    -- class, id ์ด๋ฆ„ ์ƒ์„ฑ ๋ถˆํ•„์š”
    -- CSS ํŒŒ์ผ ์•ˆ์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ถ€๋ถ„ ์ฐพ๊ธฐ ํž˜๋“ฆ ํ•ด๊ฒฐ
    -- CSS ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ์„œ ํŒŒ์ผ์„ ์ชผ๊ฐค ํ•„์š” ์—†์Œ
    -- ์Šคํƒ€์ผ ์†์ƒ์ด ๊ฒน์น˜๋Š” ๊ฒƒ ๋ฐฉ์ง€
  • CSS in JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CSS๋„ ์‰ฝ๊ฒŒ JavaScript์•ˆ์— ๋„ฃ์–ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.
    -- ์ฆ‰, HTML, JS, CSS ๊นŒ์ง€ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ JSํŒŒ์ผ ์•ˆ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

๐Ÿ‘ Styled-Components ์„ค์น˜

  • ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ ๋ช…๋ น์–ด ์ž…๋ ฅ
# with npm
$ npm install --save styled-components@latest

# with yarn
$ yarn add styled-components
  • ์‚ฌ์šฉํ•  ํŒŒ์ผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
import styled from "styled-components"

๐Ÿ‘ Styled-Components ๋ฌธ๋ฒ•

โœ”๏ธ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ


-- Templete Literals ์‚ฌ์šฉ : ๋”ฐ์˜ดํ‘œ๊ฐ€ ์•„๋‹Œ ๋ฐฑ ํ‹ฑ(`)์‚ฌ์šฉ

//Styled Components๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ 
const BlueButton = styled.button`
  background-color: blue;
  color: white;
`;

export default function App() {
  // React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋“ฏ์ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  return <BlueButton>Blue Button</BlueButton>;
}

โœ”๏ธ ์ปดํฌ๋„ŒํŠธ ์žฌํ™œ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ


-- ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•˜๊ณ  styled()์— ์žฌํ™œ์šฉํ•  ์ปดํฌ๋„ŒํŠธ ์ „๋‹ฌ ํ›„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ์Šคํƒ€์ผ ์†์„ฑ ์ž‘์„ฑ

const BlueButton = styled.button`
  background-color: blue;
  color: white;
`;

//๋งŒ๋“ค์–ด์ง„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
const BigBlueButton = styled(BlueButton)`
  padding: 10px;
  margin-top: 10px;
`;

//์žฌํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
const BigRedButton = styled(BigBlueButton)`
  background-color: red;
`;

export default function App() {
  return (
    <>
      <BlueButton>Blue Button</BlueButton>
      <br />
      <BigBlueButton>Big Blue Button</BigBlueButton>
      <br />
      <BigRedButton>Big Red Button</BigRedButton>
    </>
  );
}

โœ”๏ธ Props ํ™œ์šฉํ•˜๊ธฐ


-- ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ๋ฒ• ${} ์„ ์‚ฌ์šฉํ•˜์—ฌ js์ฝ”๋“œ ์‚ฌ์šฉ
-- props๋ฅผ ๋ฐ›์•„์˜ค๋ ค๋ฉด props๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ

  • Props๋กœ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋งํ•˜๊ธฐ

    -- ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•ด Button ์ปดํฌ๋„ŒํŠธ์— skyblue ๋ผ๋Š” props๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์žˆ์œผ๋ฉด ๋ฐฐ๊ฒฝ์ƒ‰์œผ๋กœ skyblue๋ฅผ, ์—†์œผ๋ฉด white๋ฅผ ์ง€์ •
//๋ฐ›์•„์˜จ prop์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
const Button1 = styled.button`
  background: ${(props) => (props.skyblue ? "skyblue" : "white")};
`;

export default function App() {
  return (
    <>
      <GlobalStyle />
      <Button1>Button1</Button1>
      <Button1 skyblue>Button1</Button1>
    </>
  );
}
  • Props ๊ฐ’์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ธฐ

    -- props ๊ฐ’์„ ํ†ต์งธ๋กœ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์— ํ™œ์šฉ
    -- ๋˜‘๊ฐ™์ด ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ props.color๊ฐ€ ์—†๋‹ค๋ฉด white๋ฅผ, props.color๊ฐ€ ์žˆ๋‹ค๋ฉด Props.color์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€์„œ ์Šคํƒ€์ผ ์†์„ฑ๊ฐ’์œผ๋กœ ๋ฆฌํ„ด

  • ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์•„๋‹ˆ์–ด๋„ ๊ฐ€๋Šฅ

//๋ฐ›์•„์˜จ prop ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•ด ๋ Œ๋”๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค
const Button1 = styled.button`
  background: ${(props) => (props.color ? props.color : "white")};
`;
//๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
const Button2 = styled.button`
  background: ${(props) => props.color || "white"};
`;

export default function App() {
  return (
    <>
      <GlobalStyle />
      <Button1>Button1</Button1>
      <Button1 color="orange">Button1</Button1>
      <Button1 color="tomato">Button1</Button1>
      <br />
      <Button2>Button2</Button2>
      <Button2 color="pink">Button2</Button2>
      <Button2 color="turquoise">Button2</Button2>
    </>
  );
}

โœ”๏ธ ์ „์—ญ ์Šคํƒ€์ผ ์„ค์ •ํ•˜๊ธฐ

  • Styled Components ์—์„œ createGlabalStyle ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค
import { createGlobalStyle } from "styled-components";
  • ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด CSS ํŒŒ์ผ์—์„œ ์ž‘์„ฑํ•˜๋“ฏ ์„ค์ •ํ•ด์ฃผ๊ณ  ์‹ถ์€ ์Šคํƒ€์ผ ์„ค์ •
const GlobalStyle = createGlobalStyle`
	button {
		padding : 5px;
    margin : 2px;
    border-radius : 5px;
	}
`
  • GlobalStyle ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉ
function App() {
	return (
		<>
			<GlobalStyle />
			<Button>์ „์—ญ ์Šคํƒ€์ผ ์ ์šฉํ•˜๊ธฐ</Button>
		</>
	);
}
  • ์˜ˆ์ œ : Practice๋ฒ„ํŠผ ์œ„์— hoverํšจ๊ณผ
import styled from "styled-components";

const Practice = styled.button`
  padding: 1rem;
  font-size: 2rem;
  background: pink;
  transition: 0.5s;

  &:hover {
    background: purple;
    color: white;
  }
  `;

export default function App() {
  return <Practice>Practice!</Practice>
}

๐Ÿ‘ Storybook

  • ๋งํฌ ๋ฐ”๋กœ๊ฐ€๊ธฐ : https://storybook.js.org/
  • UI ๊ฐœ๋ฐœ(Component Driven Development)์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ
  • ๋ณต์žกํ•œ ๊ฐœ๋ฐœ ์Šคํƒ์„ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๊ฐ•์ œ ์ด๋™ํ•  ํ•„์š” ์—†์ด ์ „์ฒด UI ํ•œ๋ˆˆ์— ๋ณด๊ณ  ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
  • ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ
  • ํ…Œ์ŠคํŠธ ๋ฐ ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ
  • Storybook ์ง€์› ์ฃผ์š” ๊ธฐ๋Šฅ
    -- UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์นดํƒˆ๋กœ๊ทธํ™”ํ•˜๊ธฐ
    -- ์ปดํฌ๋„ŒํŠธ ๋ณ€ํ™”๋ฅผ Stories๋กœ ์ €์žฅํ•˜๊ธฐ
    -- ํ•ซ ๋ชจ๋“ˆ ์žฌ ๋กœ๋”ฉ๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ ํˆด ๊ฒฝํ—˜ ์ œ๊ณตํ•˜๊ธฐ
    -- ๋ฆฌ์•กํŠธ๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ๋ทฐ ๋ ˆ์ด์–ด ์ง€์›ํ•˜๊ธฐ

๐Ÿ‘ 46~47์ผ์ฐจ ์ˆ˜์—…์„ ๋งˆ์น˜๋ฉฐ...

์˜ค๋Š˜ ํŽ˜์–ด๋ถ„๊ณผ์˜ ์ˆ˜์—…์œผ๋กœ ์•„์ง ๊ฐ์„ ์žก์„ ์ˆ˜๊ฐ€ ์—†์—ˆ๋˜ ๋ฆฌ์•กํŠธ์— ๋Œ€ํ•ด ํƒ~! ๊ฐ์„ ์žก์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์•„์ง ๋‹ค ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•ด์„œ ์˜ค๋Š˜ ๋ณต์Šตํ•˜๊ณ  css ๊ธฐ๋Šฅ ๋” ๋„ฃ์–ด๋ณผ ์˜ˆ์ •~

profile
[๋ฌด์—ฅ์ผ๊ธฐ] ๋ฌด์—ฅ,,, ๋‚ด๊ฐ€ ๋จธ์จ์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ์ˆ˜ ์ด์“ฐ๊นŒ,,,

0๊ฐœ์˜ ๋Œ“๊ธ€