Skip to content

Latest commit

ย 

History

History
174 lines (141 loc) ยท 5.54 KB

File metadata and controls

174 lines (141 loc) ยท 5.54 KB

Next.js Layout

layout

์Šคํƒ€์ผ์ด ๋Œ€๋ถ€๋ถ„ ๊ฒน์น˜๊ณ  ์ฝ”๋“œ์˜ ๋ฐ˜๋ณต์ด ์ผ์–ด๋‚  ๋•Œ ๊ณตํ†ต layout์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


Props

props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

function Btn(props) {
  return <button>{props.text}</button>;
}
function Btn({ text }) {
  return <button>{text}</button>;
}

์•„๋ž˜ ์ฝ”๋“œ๋Š” property๋ฅผ ์˜ค๋ธŒ์ ํŠธ๋กœ๋ถ€ํ„ฐ ๊บผ๋‚ธ ์ฝ”๋“œ๋‹ค. props๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— props ์•ˆ์— text๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์œ„์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

function Btn({ text, big }) {
  return (
    <button
      style={{
        fontSize: big ? 18 : 16,
      }}
    >
      {text}
    </button>
  );
}
function App() {
  return (
    <div>
      <Btn text="Save Changes" big={true} />
      <Btn text="Continue" big={false} />
    </div>
  );
}

๋‘ Btn์€ ๊ฐ™์€ ๊ฐœ์ˆ˜์˜ ์ธ์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ ๋‚ด์šฉ์€ ๋‹ค๋ฅด๋‹ค. props๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ style์•ˆ์—์„œ if else๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function Btn({ text, onClick }) {
  return <button onClick={onClick}>{text}</button>;
}
function App() {
  const [value, setValue] = React.useState("Save Changes");
  const changeValue = () => setValue("Revert Changes");
  return (
    <div>
      <Btn text={value} onClick={changeValue} />
      <Btn text="Continue" />
    </div>
  );
}

onClick์„ ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ์— ๋„ฃ๋Š”๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋‹จ์ง€ ํ•˜๋‚˜์˜ prop์ผ ๋ฟ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ onClick์€ ๋‹จ์ˆœํžˆ props์˜ ์ด๋ฆ„์ด๋‹ค. prop๋“ค์€ ์ž๋™์ ์œผ๋กœ return๋ฌธ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  ์ง์ ‘ prop๋“ค์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

React Memo

React Memo๋Š” ์ปดํฌ๋„ŒํŠธ์˜ props๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ฆ‰ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.

React.memo()์•ˆ์— ์ปดํฌ๋„ŒํŠธ(์—ฌ๊ธฐ์„œ๋Š” ํ•จ์ˆ˜)๋ฅผ ์ธ์ž๋กœ ๋„ฃ๋Š”๋‹ค.

function Btn({ text, onClick }) {
  return <button onClick={onClick}>{text}</button>;
}
const MemorizedBtn = React.memo(Btn);
function App() {
  const [value, setValue] = React.useState("Save Changes");
  const changeValue = () => setValue("Revert Changes");
  return (
    <div>
      <MemorizedBtn text={value} onClick={changeValue} />
      <MemorizedBtn text="Continue" />
    </div>
  );
}

MemorizedBtn์€ memorized version์˜ Btn์ด๋‹ค. ๋งŒ์•ฝ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋– ํ•œ state์˜ ๋ณ€๊ฒฝ์ด ์žˆ๋‹ค๋ฉด ๋ชจ๋“  ์ž์‹๋“ค์€ ๋‹ค์‹œ re-render๋œ๋‹ค. ์ด ์ ์ด ์ถ”ํ›„์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋А๋ ค์ง€๋Š” ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

MemorizedBtn์„ ์ด์šฉํ•ด props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค์‹œ ๊ทธ๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ „ํ•ด์ฃผ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Save Changes๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋‹จ ํ•œ ๋ฒˆ๋งŒ re-render๋œ๋‹ค.

Prop Types

PropType์€ ์–ด๋–ค ํƒ€์ž…์˜ prop์„ ๋ฐ›๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•ด์ค€๋‹ค. ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํƒ€์ž…๋“ค์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

Prop Types ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด array, boolean, function, number, object ๋“ฑ ์ด์™ธ์˜ ๊ฒƒ๋“ค๋„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ํด๋ž˜์Šค์˜ instanve์ธ์ง€๋„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

Btn.propTypes = {
  text: PropTypes.string,
  fontSize: PropTypes.number,
};

function App() {
  return (
    <div>
      <Btn text="Save Changes" fontSize={18} />
      <Btn text={14} fontSize={"Continue"} /> // ์ž˜๋ชป๋œ ๋ถ€๋ถ„
    </div>
  );
}

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์œ ํšจํ•œ ์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ReactJS๋Š” ui์—์„œ ์—๋Ÿฌ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ propTypes๋ฅผ ์ง€์ •ํ•ด์คŒ์œผ๋กœ์จ prop๋“ค์˜ type์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ React์—๊ฒŒ ๋งํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

Btn.propTypes = {
  text: PropTypes.string.isRequired,
  fontSize: PropTypes.number.isRequired,
};

isRequired์€ ์–ธ์ œ๋“  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Btn ์ปดํฌ๋„ŒํŠธ๋ฅผ renderํ•œ๋‹ค๋ฉด text์™€ fontSize๋Š” ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋งŒ์•ฝ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์—†๋‹ค๋ฉด "required(ํ•„์ˆ˜)๋ผ๊ณ  ํ‘œ์‹œ๋˜์–ด ์žˆ์ง€๋งŒ ์‹ค์ œ ๊ฐ’์€ undefined๋‹ค."๋ผ๊ณ  ์ฝ˜์†”์— ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๊ฒŒ ๋œ๋‹ค.

function Btn({ text, fontSize = 16 }) {
  return (
    <button
      style={{
        backgroundColor: "tomato",
        color: "white",
        padding: "10px 20px",
        border: 0,
        borderRadius: 10,
        fontSize,
      }}
    >
      {text}
    </button>
  );
  Btn.propTypes = {
    text: PropTypes.string.isRequired,
    fontSize: PropTypes.number,
  };

  function App() {
    return (
      <div>
        <Btn text="Save Changes" fontSize={18} />
        <Btn text={"Continue"} />
      </div>
    );
  }
}

๋งŒ์•ฝ fontSize๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด(undefined) ๊ฐ’์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. fontSize์˜ default๊ฐ’์„ 16์œผ๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค. ์ด๊ฒƒ์€ fontSize๊ฐ€ prop์œผ๋กœ์„œ ์„ค์ •๋˜์ง€ ์•Š์€ ๋‘ ๋ฒˆ์งธ Btn์—๋งŒ ํ•ด๋‹น๋œ๋‹ค. ์ฆ‰ ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์— ๊ด€ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. (Javascript ๋ฌธ๋ฒ•)

์ด์ •๋ฆฌ

์–ด๋–ค prop๋“ค์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” Btn ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณต๋ถ™ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. prop๋“ค์€ ๋ Œ๋”๋ง๋˜๊ณ  ์žˆ๋Š” Btn ์ปดํฌ๋„ŒํŠธ์˜ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋˜๊ณ  ์žˆ๋‹ค. text์™€ fontSize ๋‘ prop์„ ๋ฐ›๊ณ  ์žˆ๊ณ  ์ด Btn ์ปดํฌ๋„ŒํŠธ์˜ ์ด prop๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ Btn ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž ์•ˆ์—์„œ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ž ์•ˆ์—์„œ ์ „๋‹ฌ๋œ ๋ชจ๋“  prop๋“ค์„ ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ๋กœ์„œ ๋ฐ›๋Š”๋‹ค.