2022.06.14(Tues)
[TIL] Day34
[SEB FE] Day34
โฐย React ๊ฐ๋ฐ ๋ฐฉ์์ ์ปดํฌ๋ํธ ๋จ์๋ก ์์! (ํ์ด์ง ๋ง๋ค๊ธฐ ์ด์ ์, ์ปดํฌ๋ํธ ๋จผ์ ๋ง๋ค๊ณ ์กฐ๋ฆฝ)
๐ย โ์ํฅ์(bottom-up)โ์ผ๋ก ์ฑ ์ ์ (ํ ์คํธ easy, ํ์ฅ์ฑ good)
โฐย ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฃผ์ฒด๋ โ๋ถ๋ชจ ์ปดํฌ๋ํธ ๐ย ๋ฐ์ดํธ ํ๋ฆ โํํฅ์(top-down)โ
โ ย React๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(One-way data flow)
์์ ์ปดํฌ๋ํธ์ โ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ํจ์(handler)' ๊ทธ ์์ฒด๋ฅผ ํ์ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌํ๊ณ , ์ด ํจ์๋ฅผ ํ์ ์ปดํฌ๋ํธ๊ฐ ์คํ
// example
export default function ParentComponent() {
const [value, setValue] = useState("Change Me!");
const handleChangeValue = (newValue) => {
setValue(newValue);
};
return (
<div>
<div>๊ฐ: {value}</div>
<ChildComponent handleButtonClick={handleChangeValue} />
</div>
);
}
function ChildComponent({ handleButtonClick }) {
const handleClick = () => {
handleButtonClick("Here! value!");
};
return <button onClick={handleClick}>Change Value</button>;
}
ํจ์ ๋ด์์์ ์ด๋ ํ ๊ตฌํ์ด ํจ์ ์ธ๋ถ์ ์ํฅ์ ๋ผ์น๋ ๊ฒฝ์ฐ Side Effect ๋ฐ์
์ค์ง ํจ์์ ์ ๋ ฅ๋ง์ด ํจ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ํจ์ ์๋ฏธ (์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋ ๊ฐ ์์ โ)
โย ํจ์ ์ ๋ ฅ์ด ์๋ ๋ค๋ฅธ ๊ฐ์ด ํจ์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น ๋ ์์ ํจ์ โ
- Side Effect ์กด์ฌ โย (ex. ๋คํธ์ํฌ ์์ฒญ)
- ์ด๋ ํ ์ ๋ฌ ์ธ์๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ, ํญ์ ๋๊ฐ์ ๊ฐ ๋ฆฌํด ๋ณด์ฅ ๐ย ์์ธก ๊ฐ๋ฅ ํจ์
โย Ajax ์์ฒญ์ ์ธ๋ถ ์ํ๋ฅผ ๋ฐ๊พธ๊ธฐ ๋๋ฌธ์ ํด๋น ๊ธฐ๋ฅ์ ๊ฐ์ง ํจ์๋ ์์ ํจ์ โ
โ
ย React์์ React์ ์๊ด์๋ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ Side Effect
๐ ์ด๋ฌํ Side Effect๋ฅผ React์์ ๋ค๋ฃจ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก Effect Hook
์ ๊ณต
์ปดํฌ๋ํธ ๋ด์์ Side effect๋ฅผ ์คํํ ์ ์๊ฒ ํ๋ Hook
๐คทโโ๏ธย When ์คํ?
โย ์ต์์์์๋ง Hook ํธ์ถ
โย React ํจ์ ๋ด์์ Hook ํธ์ถ
โย ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook ํธ์ถ โ
โฐย ์ข ์์ฑ ๋ฐฐ์ด (dependency array)
useEffect(ํจ์, [์ข
์์ฑ1, ์ข
์์ฑ2, ...])
2๋ฒ์งธ ์ธ์๋ ๋ฐฐ์ด(์ข ์์ฑ ๋ฐฐ์ด)๋ก, ์กฐ๊ฑด์ ๋ด๊ณ ์์
// 2๋ฒ์งธ ์ธ์์ ์๋ฌด๊ฒ๋ ์์ฑํ์ง ์์ ๊ฒฝ์ฐ
// 1. ์ปดํฌ๋ํธ ์ฒ์ ์์ฑ, 2. props ์
๋ฐ์ดํธ, 3. state ์
๋ฐ์ดํธ ๋ ๋๋ง๋ค ์คํ
useEffect(() => {
console.log("๋ช ๋ฒ ํธ์ถ?");
})
// 2๋ฒ์งธ ์ธ์๋ก [] ๋น ๋ฐฐ์ด์ ์์ฑํ ๊ฒฝ์ฐ
// ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋ ๋๋ง ํจ์ ์คํ
// ex. ์ฒ์์ ํ๋ฒ๋ง ์ธ๋ถ API๋ก ๋ฆฌ์์ค ๋ฐ์์ค๊ณ ๋ ์ด์ API ํธ์ถ ํ์ํ์ง ์์ ๋ ์ฌ์ฉ
useEffect(() => {
console.log("๋ช ๋ฒ ํธ์ถ?");
}, [])
// 2๋ฒ์งธ ์ธ์๋ก [num]์ ์์ฑํ ๊ฒฝ์ฐ
// num์ด ์
๋ฐ์ดํธ ๋ ๋๋ง๋ค ์คํ
useEffect(() => {
console.log("๋ช ๋ฒ ํธ์ถ?");
}, [num])
โฐย ๋ก๋ฉ ํ๋ฉด ์ฒ๋ฆฌ
const [isLoading, setIsLoading] = useState(true);
// fetch ์ , ํ๋ก setIsLoading ์ค์ ํด์ฃผ๋ฉด Good
useEffect(() => {
setIsLoading(true);
fetch(`http://์๋ฒ์ฃผ์/proverbs?q=${filter}`)
.then(resp => resp.json())
.then(result => {
setProverbs(result);
setIsLoading(false);
});
}, [filter]);
return (
{isLoading ? <LoadingIndicator /> : <div>Loading Success Page</div>}
)
โ๏ธ ์ค๋ ํ๋ก๊ทธ๋๋จธ์ค ์ฌ์ด ๋ฌธ์ 2๊ฐ ํ์๋ค. ์ฌ์ด ๋ฌธ์ ๋ ์์ฐํ ๋ฌธ์ ๋๊น^^
๐ซ ์ ์ ๊ฐ์๋ก React ๊ฐ๋ ์ด ํผ๋์ค๋ฝ๋ค,, ์ค๋ ๋ณ์ฝ๋ฉ, ํ์ ๋ฆฌ์กํธ ๊ฐ์ ์ข ๋ณด๋ค๊ฐ ์์ผ์ง