[C/F TIL] 29์ผ์ฐจ - react props, state

mu-engยท2023๋…„ 5์›” 22์ผ
1

TIL (in boost camp)

๋ชฉ๋ก ๋ณด๊ธฐ
30/53
post-thumbnail

Code States
Front-end boost camp
Today
I
Learned

๐ŸŠ ์›”์š”ํŒ…! 5์›” 22์ผ, 29์ผ์ฐจ ์ˆ˜์—…


๐ŸŠ React State & Props

  • state : ์‚ด๋ฉด์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’(์ƒํƒœ)
    -- ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ ์ค‘ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’
  • props : ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’
  • ex) ํ†ต์ƒ์ ์ธ ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐ ํ–ˆ์„ ๋•Œ!
    -- ์ด๋ฆ„, ์„ฑ๋ณ„ -> props
    -- ์ทจ์—…์—ฌ๋ถ€, ๊ฒฐํ˜ผ ๋˜๋Š” ์—ฐ์•  ์—ฌ๋ถ€ ๋“ฑ -> state

๐ŸŠ Props

  • ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ(Property)
  • javascriptํ•จ์ˆ˜์™€ ํด๋ž˜์Šค, props๋ฅผ ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž(argument)์ฒ˜๋Ÿผ ๋˜๋‹ฌ๋ฐ›์•„ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ๊ธฐ์ˆ ํ•˜๋Š” React์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜
  • ๊ฐ์ฒด ํ˜•ํƒœ
    -- ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’๋„ ๋„ฃ์–ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
  • ์ฝ๊ธฐ ์ „์šฉ(read-only)
    -- ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์•„ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’
    -- ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ
    -- ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ side effect ๋ฐฉ์ง€

๐ŸŠ Props ์‚ฌ์šฉ๋ฒ•

  • 1) ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’(data)๊ณผ ์†์„ฑ์„ ์ •์˜ํ•œ๋‹ค. ->
  • 2) props๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •์˜๋œ ๊ฐ’๊ณผ ์†์„ฑ์„ ์ „๋‹ฌํ•œ๋‹ค. ->
  • 3) ์ „๋‹ฌ๋ฐ›์€ props๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

โ–ผ ์ปดํฌ๋„ŒํŠธ ์„ ์–ธ

function Parent() {
  return (
    <div className="parent">
      <h1>I'm the parent</h1>
      <Child />
    </div>
  );
};

function Child() {
  return (
    <div className="child"></div>
  );
};

โ–ผ HTML ์†์„ฑ๊ณผ ๊ฐ’ ๋‹ค๋ฃจ๋Š” ๋ฒ•

<a href="www.codestates.com">Click me to visit Code States</a>

โ–ผ React์—์„œ JSX ์†์„ฑ ๋ฐ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•1

<Child attribute={value} />

โ–ผ React์—์„œ JSX ์†์„ฑ ๋ฐ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•2

<Child text={"I'm the eldest child"} />

โ–ผ Child ์ปดํฌ๋„ŒํŠธ์—์„œ props ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์‹œ

function Child(props) {
  return (
    <div className="child"></div>
  );
};

โ–ผ Child ์ปดํฌ๋„ŒํŠธ์—์„œ props.text ๋ Œ๋”๋ง ์˜ˆ์‹œ

function Child(props) {
  return (
    <div className="child">
      <p>{props.text}</p>
    </div>
  );
};

๐ŸŠ State

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’, ์ฆ‰ ์ƒํƒœ๋Š” React state๋กœ ๋‹ค๋ฃธ

๐ŸŠ State ์‚ฌ์šฉ๋ฒ•

  • 1) React์—์„œ state๋ฅผ ๋‹ค๋ฃจ๋Š” useState ํ•จ์ˆ˜ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  • 2) usestate๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ํ˜ธ์ถœ
    -- ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ์•„๋ฌด ์ด๋ฆ„์ด๋‚˜ ๊ฐ€๋Šฅ
    -- ์ผ๋ฐ˜์ ์ธ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ ์‚ฌ๋ผ์ง€์ง€๋งŒ, state ๋ณ€์ˆ˜๋Š” React์— ์˜ํ•ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š์Œ
// useState ๋ฌธ๋ฒ•์˜ˆ์‹œ

function CheckboxExample() {
// ์ƒˆ๋กœ์šด state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ์ด๊ฒƒ์„ isChecked๋ผ ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
  const [isChecked, setIsChecked] = useState(false);
}
// useState ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น ์˜ˆ์‹œ

function CheckboxExample() {
  // 1๋ฒˆ ์ฝ”๋“œ๋ฅผ ํ’€์–ด์“ฐ๋ฉด
  const [isChecked, setIsChecked] = useState(false); // 1๋ฒˆ

  //...

  // 2๋ฒˆ ์ฝ”๋“œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  const stateHookArray = useState(false); // 2๋ฒˆ
  const isChecked = stateHookArray[0];
  const setIsChecked = stateHookArray[1];
}
  • 3) useState๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ ์š”์†Œ๋Š” ํ˜„์žฌ state๋ณ€์ˆ˜์ด๊ณ  1๋ฒˆ์งธ ์š”์†Œ๋Š” ์ด ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
    -- useState์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฐ’์€ statedml chrltrkqt
const [state ์ €์žฅ ๋ณ€์ˆ˜, state ๊ฐฑ์‹  ํ•จ์ˆ˜] = useState(์ƒํƒœ ์ดˆ๊ธฐ ๊ฐ’);
  • 4) useState ๋ฌธ๋ฒ• ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ
    -- isChecked : state๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
    -- setIsChecked : state isChecked๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
    -- useState : state hook
    -- false : state ์ดˆ๊นƒ๊ฐ’
function CheckboxExample() {
  const [isChecked, setIsChecked] = useState(false);
  // const [state ์ €์žฅ ๋ณ€์ˆ˜, state ๊ฐฑ์‹  ํ•จ์ˆ˜] = useState(state ์ดˆ๊นƒ๊ฐ’);
  • 5) ์ด state ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JSX ์—˜๋ฆฌ๋จผํŠธ ์•ˆ์— ์ง์ ‘ ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉ
    -- isChecked๋Š” boolean๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— true ๋˜๋Š” false ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ด๋„๋ก ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>

๐ŸŠ State ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์ 

  • React ์ปดํฌ๋„ŒํŠธ๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ํ˜ธ์ถœ๋˜๊ณ  ๋ฆฌ๋ Œ๋”๋ง๋จ
  • React state๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•จ
    -- ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝ ์‹œ๋„ํ•˜๋ฉด ์•ˆ๋จ!!
    -- ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝ ์‹œ๋„ ์‹œ, ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ state๊ฐ€ ์ œ๋Œ€๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

๐ŸŠ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

  • onChange : input, textarea, selec์™€ ๊ฐ™์€ ํผ ์—˜๋ฆฌ๋จผํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
    -- ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ๊ฐ’์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ state๋กœ ๊ด€๋ฆฌ
function NameForm() {
  const [name, setName] = useState("");

  const handleChange = (e) => {
    setName(e.target.value);
  }

  return (
    <div>
      <input type="text" value={name} onChange={handleChange}></input>
      <h1>{name}</h1>
    </div>
  )
};
  • onClick : ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญ์ด๋ผ๋Š” ํ–‰๋™์„ ํ•˜์˜€์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ
    -- input ํƒœ๊ทธ์— ์ž…๋ ฅํ•œ ์ด๋ฆ„์ด alert๋ฅผ ํ†ตํ•ด ์•Œ๋ฆผ ์ฐฝ์ด ํŒ์—…๋˜๋„๋ก ํ•˜๋Š” ์ฝ”๋“œ (ํ•˜๋‹จ)
function NameForm() {
  const [name, setName] = useState("");

  const handleChange = (e) => {
    setName(e.target.value);
  }

  return (
    <div>
      <input type="text" value={name} onChange={handleChange}></input>
      <button onClick={alert(name)}>Button</button>
      <h1>{name}</h1>
    </div>
  );
};

-- onClick ์ด๋ฒคํŠธ์— ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฆฌํ„ด๋ฌธ ์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋ฆฌํ„ด๋ฌธ ์™ธ๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ํ›„ ์ด๋ฒคํŠธ์— ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ

// ํ•จ์ˆ˜ ์ •์˜ํ•˜๊ธฐ

return (
  <div>
	...
    <button onClick={() => alert(name)}>Button</button>
	...
  </div>
  );
};

// ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ

const handleClick = () => {
  alert(name);
};

return (
  <div>
      ...
    <button onClick={handleClick}>Button</button>
      ...
  </div>
  );
};

... ์™ธ ํ•„์š”ํ•œ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋Š” ๊ทธ๋•Œ๊ทธ๋•Œ ์ฐพ์•„ ์จ์•ผํ• ๋“ฏ

๐ŸŠ 29์ผ์ฐจ ์ˆ˜์—…์„ ๋งˆ์น˜๋ฉฐ...

๊ฐœ๋… ์ฃผ์›Œ๋จน๊ธฐ ๋ฒ…์ฐผ๋˜ ์˜ค๋Š˜ ์ˆ˜์—…~~ ์ €๋…์— ๋ฆฌ์•กํŠธ ์ง€๋‚œ ์‹ค์Šต ๋ณต์Šต + ๋‚ด์ผ ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๊ณ ๋ฏผ์˜ ์‹œ๊ฐ„์ด ํ•„์šง!

profile
[๋ฌด์—ฅ์ผ๊ธฐ] ๋ฌด์—ฅ,,, ๋‚ด๊ฐ€ ๋จธ์จ์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ์ˆ˜ ์ด์“ฐ๊นŒ,,,

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