Frontend/React

[React] Props๋ž€? PropTypes๋กœ ํƒ€์ž… ์ฒดํฌํ•˜๊ธฐ

oneyenee 2023. 12. 17. 03:47

๐Ÿ’ก Props๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’.
  • ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ(Property)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

โœ… Props ํŠน์ง•

1. Readonly

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ›์€ Props๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๐Ÿ’ก
React๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์œผ๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ธธ ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด๋„ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Props๋Š” ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

 

2. ๊ฐ์ฒด ํƒ€์ž…์ด๋‹ค.

์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ˜๋“œ์‹œ 1๊ฐœ์˜ argument๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์—ฌ๋Ÿฌ Property๋ฅผ ๋„ฃ์–ด ์ „๋‹ฌํ•ด๋„ ๊ฐ์ฒดํ˜•ํƒœ์˜ argument ํ•˜๋‚˜๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

3. ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Props๋ฅผ ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ, ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น ์‹œ property์™€ ์ด๋ฆ„์ด ์ผ์น˜ํ•ด์•ผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

4. Props์—๋Š” ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.

String, Boolean ๋“ฑ๋“ฑ.. Function ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 


 

Props๋ฅผ ์‚ฌ์šฉํ•ด ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‘ ๊ฐœ์˜ ๋ฒ„ํŠผ์„ ๊ทธ๋ ค๋ณด๋ ค ํ•œ๋‹ค.

๋ฒ„ํŠผ์˜ value์™€ ๋ฒ„ํŠผ์˜ font-size๋ฅผ Props๋กœ ์ „์†กํ•ด๋ณด์ž.

 

 

1. App ์ƒ์„ฑ

    const App = () => {
      return (
        <div>
          <Btn text="OK" fontSize={30}></Btn>
          <Btn text="NO" fontSize={15}></Btn>
        </div>
      );
    };

 

Btn ์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ 2๊ฐœ๋ฅผ ๊ทธ๋ ค์คฌ๋‹ค. property๋กœ text์—๋Š” button์˜ value์— ๋“ค์–ด๊ฐˆ String์„ fontSize์—๋Š” button์˜ font-size๋กœ ์„ค์ •๋  number๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

 

๐Ÿ’ก
์ปดํฌ๋„ŒํŠธ์˜ property์™€ html์˜ property๋Š” ๋‹ค๋ฅด๋‹ค.
onClick๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋„ ์ปดํฌ๋„ŒํŠธ์—์„  ๊ทธ์ € prop์ผ ๋ฟ์ด๋‹ค.

 

 

2. ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

    function Btn({ text, fontSize }) {
      return (
        <button
          style={{
            fontSize,
          }}
        >
          {text}
        </button>
      );
    };

 

๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•ด text์™€ fontSize๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด์•˜๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ property์™€ ์„ ์–ธ๋ช…์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

 

 

3. render

๋‘๊ฐœ์˜ value์™€ fontsize๊ฐ€ ๋‹ค๋ฅธ ๋ฒ„ํŠผ์ด ์ƒ๊ธด๋‹ค.

 

 


 

 

๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑ ์‹œ text์— function์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ fontSize์— ์•„๋ฌด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

fontSize๋Š” undefined๋กœ ๋ฒ„ํŠผ์˜ text๊ฐ€ ์•ˆ๋ณด์ผ ์ˆ˜๋Š” ์žˆ์–ด๋„ text์— function์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋ฐ˜๋“œ์‹œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค.

 

React๋Š” ์ด๋ ‡๋“ฏ Props์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ž˜ ๋ชป ๋ณด๋‚ผ ๊ฐ€๋Šฅ์„ฑ์„ ์—ผ๋‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ฒดํฌํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค.

 

 

๐Ÿ’ก PropTypes

    function Btn({ text, fontSize }) {
      return (
        <button
          style={{
            fontSize,
          }}
        >
          {text}
        </button>
      );
    };
    
    
    Btn.propTypes = {
      text: PropTypes.string.isRequired,
      fontSize: PropTypes.number,
    };

    const App = () => {
      return (
        <div>
          <Btn text="OK" fontSize={30} />
          <Btn text="NO" fontSize={15} />
        </div>
      );
    };

 

โœ… ์ž‘์„ฑ ์‹œ ์ฃผ์˜ํ•  ์ 

1. ์ปดํฌ๋„ŒํŠธ.propTypes = { }

๋Œ€์†Œ๋ฌธ์ž์— ์œ ์˜ํ•˜์ž. ๊ฐ์ฒดํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. ๊ฐ์ฒด์˜ key๊ฐ’์€ ์ปดํฌ๋„ŒํŠธ์˜ property

 

3. ๊ฐ์ฒด์˜ value ์ž‘์„ฑ

PropTypes (๋Œ€์†Œ๋ฌธ์ž ์ฃผ์˜)

PropTypes.(๋ฐ์ดํ„ฐํƒ€์ž…).isRequired(ํ•„์ˆ˜๊ฐ’์ธ์ง€ ์˜ต์…˜๊ฐ’์ธ์ง€)

 

4. array, bool, func, number, object ... ๊ธฐ๋ณธํƒ€์ž…๋“ค์ด ์žˆ๋‹ค.

 

5. ์ฒดํฌ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์€ ๋‹ค์–‘ํ•˜๋‹ค. ๊ณต์‹๋ฌธ์„œ ํ™•์ธ

https://ko.legacy.reactjs.org/docs/typechecking-with-proptypes.html