JavaScript/React

[React] Props

newkr 2024. 8. 1. 21:24
728x90

๐Ÿ…ฟ๏ธ Props

 Props์˜ ๊ฐœ๋…์„ ๋ฐฐ์šธ ๋•Œ ๋‹น์‹œ ์ •๋ฆฌํ•ด๋‘” ๋‚ด์šฉ์€ "์ปดํฌ๋„ŒํŠธ ํ™•์žฅ ๋ฐฉ์‹์ด๋ฉฐ, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•" ์œผ๋กœ ํ•œ ์ค„ ์ •๋ฆฌํ•ด๋‘์—ˆ๋‹ค. ์ด๋ฅผ Java์™€ ์—ฎ์–ด์„œ ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅธ ๊ฐœ๋…์€ ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ค. ์‚ฌ์‹ค, Java ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์™œ ๋”ฐ๋กœ Props๋กœ ์ •๋ฆฌํ•œ์ง€๋Š” ๋ชจ๋ฅธ๋‹ค. ๋‹ค๋งŒ, ์ž๋ฐ”์˜ ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด ์žˆ๋‹ค๋ฉด "ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค"๋Š” ๋‚ด์šฉ์ผ ๊ฒƒ์ด๋‹ค.

 ์ž๋ฐ”์˜ ๊ฒฝ์šฐ, ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋“ค์ด int, String, array์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๊ฑฐ๋‚˜, ํด๋ž˜์Šค์˜ ํ˜•ํƒœ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐ์ดํ„ฐ ํ˜•ํƒœ์˜ ๊ฒฝ์šฐ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ณ , ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค. ๋ฌผ๋ก , ์ž๋ฐ”๊ฐ€ ๋žŒ๋‹ค์‹์„ ์ง€์›ํ•œ ์ดํ›„๋กœ ๋ฉ”์†Œ๋“œ์˜ ๋ฆฌํ„ด๊ฐ’์— ํ•จ์ˆ˜ ํ˜•ํƒœ์˜ ์ •์˜๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ๋Š” ํ•˜๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ํŠน์ • "๋ฉ”์†Œ๋“œ"๊ฐ€ ๋„˜๊ฒจ์ ธ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.
 ๋ฆฌ์•กํŠธ์˜ ๊ฒฝ์šฐ, ์‹ ๊ธฐํ•˜๊ฒŒ๋„ ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ Prop์œผ๋กœ ๋„˜๊ธด๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ ํ•จ์ˆ˜๋ฅผ ๊ทธ~~๋Œ€๋กœ ์“ฐ๋ฉด ๋œ๋‹ค. ๊ฐ์ฒด ์ƒ์„ฑ, ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฐœ๋…์ด๋‹ค. ์ด๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์˜ ํŠน์ง•์œผ๋กœ ์ธํ•ด ๊ฐ€๋Šฅํ•œ ๋‚ด์šฉ์ด๋‹ค. ์ด ๊ฐœ๋…์ด ์•„๋งˆ๋„ "์ผ๊ธ‰๊ฐ์ฒด" ์ผ ๊ฒƒ์ด๋‹ค. (๊ถ๊ธˆํ•˜์‹œ๋ฉด ๊ฒ€์ƒ‰ ํ•ด๋ณด์‹œ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ๋“œ๋ฆฐ๋‹ค.) ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์•„์ง ์–ด๋งˆ์–ด๋งˆํ•œ ์ฐจ์ด๋ผ๊ณ  ๋А๊ปด์ง€์ง„ ์•Š๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์•„๋งˆ๋„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์ฒด๊ฐ์ด ๋  ๋งŒํ•œ ๋ถ€๋ถ„์ผ ๊ฒƒ ๊ฐ™์•„์„œ ๋งค์šฐ ์‹ ๊ธฐํ–ˆ๋‹ค.

โŒจ๏ธ ์–ด๋–ป๊ฒŒ ์“ฐ๋Š”๋ฐ?

 Props๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ ๊ฐ€์ ธ์™”๋‹ค. React ๊ด€๋ จ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ์œ ํŠœ๋ฒ„ ๋…ธ๋งˆ๋“œ์ฝ”๋”์˜ ๋ฆฌ์•กํŠธ ๋ฌด๋ฃŒ๊ฐ•์˜ ํด๋ก  ์ฝ”๋”ฉ ์˜ˆ์ œ์ด๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, Btn์ด๋ผ๋Š” ํ•จ์ˆ˜์— onClick์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋„˜์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ์„ ์–ธ๋˜์–ด ์žˆ๊ณ , ๊ทธ ํ•จ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ๋ช…์‹œํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, onClick์ด๋ผ๋Š” ํ•จ์ˆ˜๋Š” ์•„๋ž˜ ์ฝ”๋“œ์—๋Š” ์—†๋‹ค. ๊ทธ ์ด์œ ๋Š” ํ•ด๋‹น ์ฝ”๋“œ์—๋Š” ์—†์ง€๋งŒ, ํƒ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ import ํ•ด์™€์„œ, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™”๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

function Btn({ text, onClick }) {
        return (
            <button
                onClick={onClick}
                style={{
                    backgroundColor: "tomato",
                    color: "white",
                    padding: "10px 20px",
                    border: 0,
                    borderRadius: 10
                }}
            >
                {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>
        )
    }
    const root = document.getElementById("root")
    ReactDOM.render(<App />, root)

 

๋˜ํ•œ, propTypes๋ฅผ ํ†ตํ•ด ์ •์˜๋œ ํ•จ์ˆ˜์— ๋“ค์–ด์˜ฌ props์˜ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ ๋“ฑ์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘˜ ์ˆ˜ ์žˆ๊ธฐ๋„ ํ•˜๋‹ค.

function Movie({ id, coverImg, title, summary, genres }) {
  return (
    <div>
      <img src={coverImg} alt={title} />
      <h2>
        <Link to={`/movie/${id}`}>{title}</Link>
      </h2>
      <p>{summary > 235 ? `${summary.slice(0, 235)}...` : summary}</p>
      <ul>
        {genres.map((g) => (
          <li key={g}>{g}</li>
        ))}
      </ul>
    </div>
  );
}

Movie.propTypes = { // props๋ฅผ ์ •์˜ํ•ด๋‘๋Š” ๋ถ€๋ถ„
  id: PropTypes.number.isRequired,
  coverImg: PropTypes.string.isRequired,
  title: PropTypes.string.isRequired,
  summary: PropTypes.string.isRequired,
  genres: PropTypes.arrayOf(PropTypes.string).isRequired,
};

 

๋ฆฌ์•กํŠธ๋Š” ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋„ ์žˆ๊ตฌ๋‚˜ ํ•˜๋Š” ๊ฒฝํ—˜์„ ํ–ˆ๋˜ ์‹œ๊ฐ„์ด์—ˆ๋‹ค.

728x90

'JavaScript > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] State  (0) 2024.07.16
[React] JSX  (0) 2024.07.14