[TIL] Day29
[SEB FE] Day29
Props
- ์ปดํฌ๋ํธ์ ์์ฑ(property)
 - ์ธ๋ถ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ [๋ถ๋ชจ ์ปดํฌ๋ํธ(์์ ์ปดํฌ๋ํธ)๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ]
 
๐ ์ปดํฌ๋ํธ๊ฐ ์ต์ด ๋ ๋๋ง ๋ ๋ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ด๊น๊ฐ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ- ๊ฐ์ฒด ํํ
 - ์ฝ๊ธฐ ์ ์ฉ;
 ready-only(๋ณ๊ฒฝ โ) โimmutableํ ๋ฐ์ดํฐ- ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉํจ
 - ํด๋์ค ์ปดํฌ๋ํธ, ํจ์ํ ์ปดํฌ๋ํธ ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅ
 - ์ฌ๋ฌ ๊ฐ ์ง์  ๊ฐ๋ฅ
 
Props ์ฌ์ฉ ๋ฐฉ๋ฒprops๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ ๊ฐ&์์ฑ ์ ๋ฌprops ๋ ๋๋งfunction Parent() {
  return (
    <div className="parent">
      <h1>I'm the parent</h1>
      <Child text={"I'm the eldest child"}/> {/* ์์ฑ & ๊ฐ ํ ๋น */}
    </div>
  );
};
function Child(props) {
  return (
    <div className="child">
			<p>{props.text}</p> {/* props ๋ ๋๋ง */}
		</div>
  );
};
โย props๋ {attribute: value} ํํ๋ก ์ถ๋ ฅ
ํ๊ทธ ์ฌ์ด์
value๋ฅผ ๋ฃ์ด ์ ๋ฌ โ ํด๋นvalue์ ์ ๊ทผํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅ
function Parent() {
  return (
    <div className="parent">
        <h1>I'm the parent</h1>
        <Child>I'm the eldest child</Child>
    </div>
  );
};
function Child(props) {
  return (
    <div className="child">
        <p>{props.children}</p>
    </div>
  );
};
์ปดํฌ๋ํธ์ ์ฌ์ฉ ์ค ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ณํ ์ ์๋ ๊ฐ
state๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ ์ค ํ๋
const [state ์ ์ฅ ๋ณ์, state ๊ฐฑ์  ํจ์] = useState(์ํ ์ด๊ธฐ ๊ฐ);
import { useState} from 'react';
function CheckboxExample() {
	// useState ํธ์ถ = 'state' ๋ณ์ ์ ์ธ (ํจ์๊ฐ ๋๋๋ ์ฌ๋ผ์ง์ง ์์)
	const [isChecked, setIsChecked] = useState(false);
	// setIsChecked: state 'isChecked'๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์
}
// ์ฌ์ฉ
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
function CheckboxExample() {
  const [isChecked, setIsChecked] = useState(false);
  const handleChecked = (event) => {
    setIsChecked(event.target.checked);
  };
  return (
    <div className="App">
      <input type="checkbox" checked={isChecked} onChange={handleChecked} />
      <span>{isChecked ? "Checked!!" : "Unchecked"}</span>
    </div>
  );
}
โย ์ปดํฌ๋ํธ์ ์ํ(state)๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋กญ๊ฒ ํธ์ถ๋๊ณ , ๋ฆฌ๋ ๋๋ง๋จ
โย React state๋ ์ํ ๋ณ๊ฒฝ ํจ์ ํธ์ถ๋ก ๋ณ๊ฒฝํด์ผ ํจ (๊ฐ์  ๋ณ๊ฒฝ ์๋ โ)
โย state๋ ํ์ ์ปดํฌ๋ํธ์์๋ ์กด์ฌ ๊ฐ๋ฅ
Event handler) ์ ๋ฌ<button onClick={handleEvent}>Event</button>
onChangestate๋ก ๊ด๋ฆฌํ๊ณ  ์
๋ฐ์ดํธํจonChange example LogiconChange ์ด๋ฒคํธ ๋ฐ์ โ e.target.value๋ฅผ ํตํด ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ฒจ์๋ input๊ฐ์ ์ฝ์ด์ดhandleChange ํจ์ ์๋ โ ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ธด input ๊ฐ์ setState๋ฅผ ํตํด ์๋ก์ด state๋ก ๊ฐฑ์ onClickfunction NameForm() {
	// useState ํธ์ถ
	const [name, setName] = useStaet("");
	
	// event handling
	const handleChange = (e) => {
		setName(e.target.value);
	}
	return (
		<div>
			<input type="text" value={name} onChange={handleChange}></input>
			<button onClick={alert(name)}>Button</button>
			{/* alert(name) ํจ์๋ฅผ ๋ฐ๋ก ํธ์ถ
			 -> ์ปดํฌ๋ํธ ๋ ๋๋ง๋  ๋ ํจ์ ์์ฒด๊ฐ ์๋ ํจ์ ํธ์ถ ๊ฒฐ๊ณผ๊ฐ onClick์ ์ ์ฉ
			 -> (๋ฒํผ ํด๋ฆญํ  ๋๊ฐ ์๋) ๋ ๋๋ง๋  ๋ ์คํ๋์ด์ undefined ๋ฐํ
       		 => onClick ์ด๋ฒคํธ์ ํจ์ ์ ๋ฌ์ ๋ฆฌํด๋ฌธ ์์์ ํจ์ ์ ์ํ๊ฑฐ๋ 
					๋ฆฌํด๋ฌธ ์ธ๋ถ์์ ํจ์ ์ ์ ํ ์ด๋ฒคํธ์ ํจ์ ์์ฒด๋ฅผ ์ ๋ฌํด์ผ ํจ */}
		</div>
	)
};
// ํจ์ ์ ์
return (
	<div>
		<button onClick={() => alert(name)}Button</button>
	</div>
	)
};
----------
// ํจ์ ์์ฒด ์ ๋ฌ
const handleClick = () => {
	alert(name);
};
return (
	<div>
		<button onClick={handleClick}>Button</button>
	</div>
	);
};
// pop-up example
// ๊ธฐ๋ณธ ํ๋ฉด์ผ๋ก 'Open me' Button ํ์ -> ๋๋ฅด๋ฉด 'Success!' ๋ฌธ๊ตฌ์ ํจ๊ป
// 'Close me' Button์ด ํ์
์ผ๋ก ๋ฑ์ฅ
// 'Close me' Button ๋๋ฅด๋ฉด ๋ค์ ํ์
 ๋ซํ
import React, { useState } from "react";
import "./styles.css";
function App() {
  const [showPopup, setShowPopup] = useState(false);
  const togglePopup = () => {
    setShowPopup(!showPopup)
		
	 // ! ๋ ์๋์ฒ๋ผ ์กฐ๊ฑด๋ฌธ์ ์ด์ฉํด์ ํ๋๋ฐ ์์ฒ๋ผ ํ๋ฉด ํ์ค์ ์์  ๊ฐ๋จํ ๊ตฌํ ๊ฐ๋ฅ !
	 // if(showPopup === false) {
	 // setShowPopup(true)
	 // } else {
	 //   setShowPopup(false)
	 // }
  };
  return (
    <div className="App">
      <h1>Fix me to open Pop Up</h1>
      <button className="open" onClick={togglePopup}>
        Open me
      </button>
      {showPopup ? (
        <div className="popup">
          <div className="popup_inner">
            <h2>Success!</h2>
            <button className="close" onClick={togglePopup}>
              Close me
            </button>
          </div>
        </div>
      ) : null}
    </div>
  );
}
export default App;
// controlled-component example
import "./styles.css";
import React, { useState } from "react";
export default function App() {
  const [username, setUsername] = useState("");
  const [msg, setMsg] = useState("");
  const handleChangeMsg = (event) => {
    setMsg(event.target.value);
  };
  return (
    <div className="App">
      <div>{username}</div>
      <input
        type="text"
        value={username}
        onChange={(event) => setUsername(event.target.value)}
        placeholder="์ฌ๊ธฐ๋ ์ธํ์
๋๋ค."
        className="tweetForm__input--username"
      ></input>
      <div>{msg}</div>
      <textarea
        placeholder="์ฌ๊ธฐ๋ ํ
์คํธ ์์ญ์
๋๋ค."
        className="tweetForm__input--message"
        onChange={handleChangeMsg}
        value={msg}
      ></textarea>
    </div>
  );
}
React ๊ฐ๋ฐ ๋ฐฉ์์ ํ์ด์ง ๋จ์๊ฐ ์๋, ์ปดํฌ๋ํธ ๋จ์๋ก ์์
์ํฅ์(bottom-up)์ผ๋ก ์ฑ ๊ฐ๋ฐ โ ํ ์คํธ๊ฐ ์ฝ๊ณ ํ์ฅ์ฑ ๐
React๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(one-way data flow)์ ๋ฐ๋ฆ
์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋๋๋ ๊ฒ์ด ๊ฐ์ฅ ๋จผ์  ํด์ผํ ์ผ!
๐ย ํ์ด์ง๋ฅผ ๋ง๋ค๊ธฐ ์ด์ ์, ์ปดํฌ๋ํธ๋ฅผ ๋จผ์  ๋ง๋ค๊ณ ์กฐ๋ฆฝํ๊ธฐ
ย โย ๋ฐ์ดํฐ ์ ๋ฌ ์ฃผ์ฒด๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ
๋ฐ์ดํฐ ํ๋ฆ-ํํฅ์(top-down)) โ ๋ฐ์ดํฐ๋ ์์์ ์๋๋ก!
ย โย ๋ ๊ฐ์ ์์ ์ปดํฌ๋ํธ๊ฐ ํ๋์ ์ํ์ ์ ๊ทผํ๊ณ ์ ํ  ๋ ๋ ์์์ ๊ณตํต ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์์นํด์ผ ํจ
๐คทโโ๏ธย Q: ์ด๋ค ๋ฐ์ดํฐ๋ฅผ state๋ก ๋์ด์ผ ํ๋์?
๐โโ๏ธย A: 1. ๋ถ๋ชจ๋ก๋ถํฐ props๋ฅผ ํตํด ์ ๋ฌ๋๋ฉด โ
ย ย ย ย ย ย ย ย ย  2. ์๊ฐ์ด ์ง๋๋ ๋ณํ์ง ์๋๋ค๋ฉด โ
ย ย ย ย ย ย ย ย ย  3. ์ปดํฌ๋ํธ ์์ ๋ค๋ฅธ state๋ props๋ก ๊ณ์ฐ์ด ๊ฐ๋ฅํ๋ค๋ฉด โ
3์ผ๊ฐ์ ํด์ผ์ด ๋๋๊ณ , ๋ถ๊ณผ ๋ช์ผ ์ ์ ์งํํ Intro, SPA ์ฝ๋๋ ๊ธฐ์ต์ด ์ ๋์ ๋๋ฌ๋๋ฌ ์  ์ฝ๋๋ฅผ ๊ตฌํํ๋ค.
+ํธ์ ์ ์ก Form ๊ธฐ๋ฅ์ ์ถ๊ฐ ๊ตฌํํ์ด์ผ ํ๋๋ฐ ์ฝ์ง ์์๋ค.๐ฅฒ
์ ๊ทธ๋ฆฌ๊ณ ๊ณ์ console ์ฐฝ์Warning: Each child in a list should have a unique โkeyโ prop.๊ฒฝ๊ณ ์ฐฝ์ด ๊ณ์ ๋ ์์ด์ ์์ ๋๋ผ ์ ๋จน์๋๋ฐ ํ์ด๋ถ์ดmap์๋ ๊ณณ์key๋ฅผ ์ถ๊ฐํด์ ์์ด๋ค.map&keyํ ์์ผ๋ก ๊ธฐ์ตํ์..
ํ์ด๋ถ๊ณผ ํจ๊ปํด์ ์ด์ฐ์ด์ฐBare Minimum Requirement Test๋ ํต๊ณผํ์ง๋ง,
์์ง๋ ๋ญ๊ฐ ์ฝ๋๊ฐ ๋จธ๋ฆฟ์์์ ์ํจ ๋๋์ด๋ผ ์ข ๋ ๊ณต๋ถํ๊ณ ์ฝ๋ ์ดํด ๊ณผ์ ?์ ์ ๋ฆฌํด๋ด์ผ๊ฒ ๋ค.
์ค๋์ ์์ ๋๋๊ณ ์๋ฐ ๋ํ ๊ฐ๋ค์์ ์ถ๊ฐ ํ์ต์ ํ ์๊ฐ์ด ์์๋ค.. (ํ๊ณ๐ซ )
๋ด์ผ์Advanced Challenge์ธ ํํฐ ๊ธฐ๋ฅ๊ณผ ํธ์ ์ญ์  ๊ธฐ๋ฅ ๊ตฌํํด๋ณด๊ธฐ!
