๐Ÿค” React props ๋ฆฌ๋ Œ๋”๋ง

lim1313ยท2021๋…„ 9์›” 7์ผ
4

TILPLUS

๋ชฉ๋ก ๋ณด๊ธฐ
16/40
post-custom-banner

์ด ๊ธ€์€ react๊ฐ€ ๋ฆฌ๋žœ๋”๋ง๋˜๋Š” ์ƒํ™ฉ ์ค‘ props๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.

props๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ?

React๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. state๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์„ ๋•Œ
  2. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋˜์—ˆ์„ ๋•Œ
  3. porps๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์„ ๋•Œ

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋ฆฌ์•กํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋งํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, 3๋ฒˆ์— ํ•ด๋‹นํ•˜๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

๋‚ด๊ฐ€ ์•Œ๊ธฐ๋กœ๋Š” props๋Š” immutable data๋กœ read-only์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, props๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ๋‹ค๋‹ˆ?

์ด์— ๋Œ€ํ•œ ํ•ด๋‹ต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ƒˆ๋กœ์šด props๋ฅผ ์ „๋‹ฌ๋ฐ›๋‹ค.

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ ํ˜น์€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์œผ๋กœ state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋•Œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ƒˆ๋กœ์šด props๊ฐ’์„ ๋‚ด๋ ค์ฃผ๊ฒŒ ๋œ๋‹ค.
์ƒˆ๋กœ์šด props๊ฐ’์„ ๋ฐ›๊ฒŒ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์œ„์— ์ ์€ ๋žœ๋”๋ง ์ƒํ™ฉ ์ค‘ 3๋ฒˆ์— ํ•ด๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ๊ฐ™์€ props๋ฅผ ๋ฐ›๊ฒŒ๋˜๋”๋ผ๋„ ๋ฆฌ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฆฌ๋žœ๋”๋ง์˜ ๋นˆ๋ฒˆํ•œ ๋ฐœ์ƒ์€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž react.memo()๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋žœ๋”๋ง์„ ๋ง‰์•„์ฃผ๊ธฐ๋„ ํ•œ๋‹ค.

์ปดํผ๋„ŒํŠธ๊ฐ€ React.memo()๋กœ ๋ž˜ํ•‘ ๋  ๋•Œ, React๋Š” ์ปดํผ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ง•(Memoizing)ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ๋•Œ ๋™์ผํ•œ ์ฐธ์กฐ ๊ฐ’์˜ prop์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด, React๋Š” ๋ฉ”๋ชจ์ด์ง•(Memoizing)๋œ ๋‚ด์šฉ์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋žœ๋”๋ง์„ ๋ฐฉ์ง€์‹œํ‚จ๋‹ค.

App ์ปดํฌ๋„ŒํŠธ

function App() {
  const [up, setUp] = useState(0);

  const upNum = () => {
    let num = up;
    setUp(num + 1);
  };

  return (
    <>
      <Home onUpClick={upNum} />
      <About up={up} />
      <Detail />

  {/* <Detail up={up} /> */}
  {/* Deatil ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„, 
  ์ด๋ ‡๊ฒŒ ์จ์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค*/}

   </>
  );
}

export default App;

Detail ์ปดํฌ๋„ŒํŠธ

import React, { memo } from 'react';

const Detail = memo((props) => {
  console.log('detail render');
  return <div>this is detail</div>;
});

export default Detail;

์œ„์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด

  1. About ์ปดํฌ๋„ŒํŠธ์—์„œ click์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, up ์ƒํƒœ๊ฐ€ 1์”ฉ ์ปค์ง€๋ฉด์„œ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•˜๊ฒŒ ๋œ๋‹ค.

  2. ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ๋ฆฌ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค.

  3. Detail ์ปดํฌ๋„ŒํŠธ๋Š” memo๋กœ ๊ฐ์‹ธ์คฌ๊ณ , ๋ณ€๊ฒฝ๋˜๋Š” state๋‚˜ prop์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ ๊ฒฐ๊ณผ, console์—๋Š” 'detail render'์ด ํ•œ๋ฒˆ๋งŒ ์ฐํžˆ๊ณ , ์ดํ›„์—๋Š” ์ฐํžˆ์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.


์ •๋ฆฌ

๋ฆฌ๋ Œ๋”๋ง์˜ ์ƒํ™ฉ ์ค‘ props๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋ฐ”๋€Œ์–ด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๊ณ , ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— props๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด, ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ, react.memo() ๋“ฑ์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰์•„, ์„ฑ๋Šฅ์„ ๊ฐœ์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

profile
start coding
post-custom-banner

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