Section 1์์ ๊ฐ์ฅ ์ด๋ ต๋ค๊ณ ๋๊ปด์ก๋ React ๋ถ๋ถ์ ๋ค์ ๋ฐฐ์ ์ต๋๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์์ ์ปดํฌ๋ํธ๊ฐ ์๋ค ๊ฐ๋ค ๋ง์ด ํด์ ์ข ์ ์ ์์๊ธด ํ์ง๋ง ์ข๋ง ๋ฐฐ์ ๋ ๋ด์ฉ ๋ ์ ๋ฆฌํ๋ฉด ์ดํด ์ํ ์ ์์ ๊ฒ ๊ฐ์์!๐ ๋ด์ผ๊น์ง React๋ฅผ ์ด์ฉํ ํญ๊ณต๊ถ ์์ฝ ์ฌ์ดํธ๋ฅผ ๊ตฌํํ๋๋ฐ์. ์์ง REST API๋ก ์ด๋ป๊ฒ ๊ตฌํํ๋์ง์ ๋ํด ๋ชปํ์์ง๋ง ๋ด์ผ๊น์ง ํ ์ ์๋๋ก ๋ง์ ์ด์ฌํ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋น
Lifting State Up
React์์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ ํ๋ฆ์ ํํฅ์์ธ๋ฐ์. ๋ฐ๋ผ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค. ํ์ง๋ง ๋ถ๋ชจ ์ปดํฌ๋ํธ์์์ ์ํ๊ฐ ํ์ ์ปดํฌ๋ํธ์ ์ํด ๋ณํํ๋ ๊ฒฝ์ฐ๋ ์๋๋ฐ์. ์ด ๊ฒฝ์ฐ React์ ๊ฐ์ฅ ํฐ ํน์ง์ธ ํํฅ์์ ์๋ฐฐ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Lifting state up์ด๋ผ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
import React, { useState } from "react";
export default function ParentComponent() {
const [value, setValue] = useState("๋ ๋ฐ๊ฟ์ค!");
const handleChangeValue = () => {
setValue("๋ณด์ฌ์ค๊ฒ ์์ ํ ๋ฌ๋ผ์ง ๊ฐ");
};
return (
<div>
<div>๊ฐ์ {value} ์
๋๋ค</div>
<ChildComponent handleButtonClick = {handleChangeValue}/> //๋ถ๋ชจ ์ปดํฌ๋ํธ์์์ ํจ์๋ฅผ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ
</div>
);
}
function ChildComponent({handleButtonClick}) {
const handleClick = () => {
handleButtonClick(); // ์์ ์ปดํฌ๋ํธ์ ํจ์๊ฐ ์คํ๋๋ฉด ๋ถ๋ชจ์ ์ปดํฌ๋ํธ ๋ณ๊ฒฝ
};
return <button onClick={handleClick}>๊ฐ ๋ณ๊ฒฝ</button>; //๋ฒํผ์ ๋๋ฅด๋ฉด handleClick ํจ์ ์คํ
}
Effect Hook
Side Effect
ํจ์ ๋ด์์ ์ด๋ค ๊ตฌํ์ด ํจ์ ์ธ๋ถ์ ์ํฅ์ ๋ผ์น๋ ๊ฒฝ์ฐ Side Effect๊ฐ ์๋ค๊ณ ํฉ๋๋ค.
Side Effect๊ฐ ์๋ ํจ์๋ ์์ํจ์๋ผ๊ณ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ ํ ์ ๋ฌ ์ธ์๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ, ํญ์ ๋๊ฐ์ ๊ฐ์ด ๋ฆฌํดํ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค. ๊ทธ๋์ ์์ธก ๊ฐ๋ฅํ ํจ์์ ๋๋ค. ์์ ํจ์์ ํน์ง์ ๊ณ ๋ คํ๋ฉด Math.random()๊ณผ fetch API๋ฅผ ์ด์ฉํด AJAX ์์ฒญ์ ํ๋ ํจ์๋ ์์ธก์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์์ ํจ์๊ฐ ์๋๋๋ค.
Effect Hook
useEffect๋ ์ปดํฌ๋ํธ ๋ด์์ Side effect๋ฅผ ์คํํ ์ ์๊ฒ ํ๋ Hook ์ ๋๋ค. useEffect์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ํจ์์ ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ Effect Hook์ด ์คํ๋ฉ๋๋ค.
useEffect์ ๋ ๋ฒ์งธ ์ธ์๋ ๋ฐฐ์ด์ ๋๋ค. ์ด ๋ฐฐ์ด์ boolean ๊ฐ์ด ์๋ ๊ฐ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋๋ผ๋ ์กฐ๊ฑด์ ๋ด๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์, ํด๋น ๋ฐฐ์ด์ ์ด๋ค ๊ฐ์ ๋ชฉ๋ก์ด ๋ค์ด๊ฐ๋๋ค. ์ด ๋ฐฐ์ด์ ํน๋ณํ ์ข ์์ฑ ๋ฐฐ์ด์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๋ ๋ฒ์งธ ์ธ์์ ์ข ์์ฑ ๋ฐฐ์ด ๋ด์ ์์๊ฐ ๋ณํํ ๋ ์ฒซ ๋ฒ์งธ ์ธ์์ ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
1. ๋น ๋ฐฐ์ด ๋ฃ๊ธฐ: useEffect(ํจ์, [])
2. ์๋ฌด๊ฒ๋ ๋ฃ์ง ์๊ธฐ (๊ธฐ๋ณธ ํํ): useEffect(ํจ์)
2๋ฒ์ธ ๊ธฐ๋ณธ ํํ์ useEffect๋ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋๊ฑฐ๋, props๊ฐ ์ ๋ฐ์ดํธ๋๊ฑฐ๋, ์ํ(state)๊ฐ ์ ๋ฐ์ดํธ๋ ๋ effect ํจ์๊ฐ ์คํ๋ฉ๋๋ค. ๋ฐ๋ฉด์ 1๋ฒ ๋น ๋ฐฐ์ด์ useEffect์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉํ๋ฉด, ์ด ๋์๋ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋ ๋๋ง effect ํจ์๊ฐ ์คํ๋ฉ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ก๋ ์ธ๋ถ API๋ฅผ ํตํด ๋ฆฌ์์ค๋ฅผ ๋ฐ์์ค๊ณ ๋ ์ด์ API ํธ์ถ์ด ํ์ํ์ง ์์ ๋๊ฐ ์์ต๋๋ค.
Hook ์ธ ๋ ์ฃผ์ํ ์
- ์ต์์์์๋ง Hook์ ํธ์ถํฉ๋๋ค. ์ฆ, ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ํน์ ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ํธ์ถํ์ง ์์ต๋๋ค.
- React ํจ์ ๋ด์์ Hook์ ํธ์ถํฉ๋๋ค. ์ผ๋ฐ์ ์ธ JavaScript ํจ์์์๋ Hook์ ํธ์ถํ์ง ์์ต๋๋ค.
AJAX ์์ฒญ
- ์ปดํฌ๋ํธ ๋ด์์ ์ฒ๋ฆฌ: ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ ์ฒ๋ฆฌ
- ์ปดํฌ๋ํธ ์ธ๋ถ์์ ์ฒ๋ฆฌ: ์ปดํฌ๋ํธ ์ธ๋ถ๋ก API ์์ฒญ์ ํด์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
AJAX ์์ฒญ์ด ๋๋ฆด ๊ฒฝ์ฐ ์ํ์ฒ๋ฆฌ๋ฆ ํตํด LoadingIndicator ๊ตฌํ์ ํ ์ ์์ต๋๋ค. ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
const [isLoading,setIsLoading] = useState(true);
// LoadingIndicator ์ปดํฌ๋ํธ๋ ๋ณ๋๋ก ๊ตฌํํ์์ ๊ฐ์
return {isLoading ? <LoadingIndicator /> : <div>๋ก๋ฉ ์๋ฃ ํ๋ฉด</div>}
'TIL > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TIL 71: var, let, const (0) | 2022.09.19 |
---|---|
TIL 34: [React] ๋ฐ์ดํฐ ํ๋ฆ์ ์ดํด์ ๋น๋๊ธฐ ์์ฒญ ์ฒ๋ฆฌ (0) | 2021.09.07 |
TIL 30: [JS/Node] ๋น๋๊ธฐ - fetch API (0) | 2021.09.01 |
TIL 29: [JS/Node] ๋น๋๊ธฐ - ํ์ด๋จธ/ํ์ผ์ด๊ธฐ (0) | 2021.09.01 |
TIL 28: [JS/Node] ๋น๋๊ธฐ - Underbar (0) | 2021.08.30 |