[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>
onChange
state
๋ก ๊ด๋ฆฌํ๊ณ ์
๋ฐ์ดํธํจonChange
example LogiconChange
์ด๋ฒคํธ ๋ฐ์ โ e.target.value
๋ฅผ ํตํด ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ฒจ์๋ input
๊ฐ์ ์ฝ์ด์ดhandleChange
ํจ์ ์๋ โ ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ธด input
๊ฐ์ setState
๋ฅผ ํตํด ์๋ก์ด state
๋ก ๊ฐฑ์ onClick
function 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
์ธ ํํฐ ๊ธฐ๋ฅ๊ณผ ํธ์ ์ญ์ ๊ธฐ๋ฅ ๊ตฌํํด๋ณด๊ธฐ!