๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
React/๊ฐœ๋… ์ •๋ฆฌ

React #4. Props

by eugene663 2022. 1. 16.

๐Ÿ“Œ Props

๋ฆฌ์•กํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ง„ํ–‰๋˜๋Š” ๋‹จ๋ฐฉํ–ฅ์˜ ํ๋ฆ„์„ ๊ฐ€์ง„๋‹ค. ์ด ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„ ์•„๋ž˜์—์„œ ์ž์‹์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Props ๋ผ๊ณ  ํ•œ๋‹ค.

์ด์ „ ๊ธ€์˜ ์˜ˆ์ œ(๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์ˆซ์ž ๋ณ€๊ฒฝ) ์˜ˆ์ œ๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ๋‹ค.

Props์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์ด๋‹ค.

 

  • Button ์ปดํฌ๋„ŒํŠธ(src/Button.js)
function Button(props) {
  return <button onClick={props.onClick}>{props.text}</button>;
}

export default Button;

๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” props๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ณ , ๊ทธ ๊ฐ์ฒด์˜ onClick, text ์š”์†Œ๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

  • App ์ปดํฌ๋„ŒํŠธ(src/App.js)
import React, { useState } from 'react';
import Button from './Button';

function App() {
  const [number, setNumber] = useState(0);

  function onClickIncrease() {
    setNumber(number + 1);
  }
  function onClickDecrease() {
    setNumber(number - 1);
  }
  return (
    <div>
      <div>๊ฐ’ : {number}</div>
      <Button onClick={onClickIncrease} text="+1" />
      <Button onClick={onClickDecrease} text="-1" />
    </div>
  );
}

export default App;

๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ• ๋•Œ, ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”ํ•œ onClick, text๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

 

๐Ÿ“Œ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น

์œ„์˜ ๋ฐฉ๋ฒ•๋ณด๋‹ค ์กฐ๊ธˆ ์—…๊ทธ๋ ˆ์ด๋“œ ๋œ ์‚ฌ์šฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ํ•ด์ฒดํ•˜๊ณ  ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•œ๋‹ค.

function Button({ text, onClick }) {
  return <button onClick={onClick}>{text}</button>;
}

export default Button;

๊ธฐ์กด์— ๋ฐ›๊ณ  ์žˆ๋˜ props๋ผ๋Š” ๊ฐ์ฒด ์•ˆ์˜ ๊ฐ’ text์™€ onClick์„ ์ถ”์ถœํ•ด์„œ ๊ฐ๊ฐ ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค.

์ด ๋ฐฉ๋ฒ•, ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋‹จ์ˆœํžˆ props๋งŒ ์ž‘์„ฑํ–ˆ์„ ๋•Œ ๋ณด๋‹ค ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ , ๊ฐ ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ Children

์ง€๊ธˆ๊นŒ์ง€๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ซํžŒ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

Children์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ๋‹ค๋ฅธ ํƒœ๊ทธ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.

 

  • Layout ์ปดํฌ๋„ŒํŠธ (src/Layout.js)
import styles from './Layout.module.css';

function Layout({ children }) {
  return <div className={styles.container}>{children}</div>;
}

export default Layout;
  • Layout CSS (src/Layout.module.css)
.container {
  padding: 10px;
  border: 1px solid black;
  border-radius: 10px;
}

ํŒจ๋”ฉ๊ณผ ๋ณด๋”๋ฅผ ๊ฐ–๋Š” Layout ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. Props๋กœ chidren์„ ๋ฐ›๋Š”๋‹ค.

chidren ์†์„ฑ์€ ๋‹ค๋ฅธ ์†์„ฑ๋“ค์ด ์ปดํฌ๋„ŒํŠธ ํƒœ๊ทธ์—์„œ ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, ์ž์‹ ํƒœ๊ทธ๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š”๋‹ค.

 

  • App ์ปดํฌ๋„ŒํŠธ (src/App.js)
import React, { useState } from 'react';
import Button from './Button';
import Layout from './Layout';

function App() {
  const [number, setNumber] = useState(0);

  function onClickIncrease() {
    setNumber(number + 1);
  }
  function onClickDecrease() {
    setNumber(number - 1);
  }
  return (
    <Layout>
      <div>๊ฐ’ : {number}</div>
      <Button onClick={onClickIncrease} text="+1" />
      <Button onClick={onClickDecrease} text="-1" />
    </Layout>
  );
}

export default App;

div ํƒœ๊ทธ์—์„œ Layout ํƒœ๊ทธ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค. Layout์˜ children์€ div ํƒœ๊ทธ ํ•˜๋‚˜์™€ Button ์ปดํฌ๋„ŒํŠธ ๋‘๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ ์ž์‹ ํƒœ๊ทธ๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•œ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ,

์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ ์„ค๊ณ„์™€ ์ปดํฌ๋„ŒํŠธ ๋„ค์ด๋ฐ์„ ํ™•์‹คํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค!

 

 

 

์ฐธ๊ณ  ๋ฐ ์‚ฌ์ง„ ์ถœ์ฒ˜: https://codemate.kr/project/%EC%BD%94%EB%AE%A4%EB%8B%88%ED%8B%B0-%EB%AA%A8%EA%B0%81%EC%BD%94-WEB-%EB%A9%94%EC%9D%B4%ED%8A%B8-%EC%9B%B9-%EC%8B%AC%ED%99%94-%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%8E%B8/5-1.-Props