๐พ state๋?
• state๋ ์ปดํฌ๋ํธ ๋ด์์ ๋ณํ ์ ์๋ ๊ฐ, ์ฆ ์ํ๋ฅผ ์๋ฏธํ๋ค.
• React ์ปดํฌ๋ํธ๋ state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋กญ๊ฒ ํธ์ถ๋๊ณ , ๋ฆฌ๋ ๋๋ง ๋๋ค. (UI๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋จ)
• state๋ props์ฒ๋ผ App ์ปดํฌ๋ํธ์ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ ์ํฅ์ ์ฃผ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด์ง๋ง, props๋ (ํจ์ ๋งค๊ฐ๋ณ์์ฒ๋ผ) ์ปดํฌ๋ํธ์ ์ ๋ฌ๋๋ ๋ฐ๋ฉด state๋ (ํจ์ ๋ด์ ์ ์ธ๋ ๋ณ์์ฒ๋ผ) ์ปดํฌ๋ํธ ์์์ ๊ด๋ฆฌ๋๋ค. ์ฆ, props๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ์ธ๋ถ์๋ฅผ ์ํ ๋ฐ์ดํฐ๊ณ , state๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๋ด๋ถ์๋ฅผ ์ํ ๋ฐ์ดํฐ์ด๋ค.
๐พ useState
import { useState } from 'react'; // useState ํธ์ถ
const [state, setState] = useState(initialState);
• state
์ํ ์ ์ง ๊ฐ
• setState
์ํ ๋ณ๊ฒฝ ํจ์
• initialState
์ด๊ธฐ๊ฐ
โ๏ธ useState ๋ถํด
const [mode, setMode] = useState("init");
console.log(mode); // init
console.log(setMode) // state ๊ฐ์ ๊ฐฑ์ ํ๋ function
/* useState๋ ์ฃผ๋ก ์ด ํํ๋ก(๊ตฌ์กฐ๋ถํดํ ๋น) ์ฌ์ฉํ๋ค.
init์ ์ด๊ธฐ๊ฐ, mode๋ state์ ๊ฐ์ ์ฝ๊ณ , setMode๋ state์ ๊ฐ์ ๊ฐฑ์ ํ๋ค. */
----- useState ๋ถํด -----
// useState๋ ๋ฐฐ์ด์ ๋ฆฌํดํ๊ณ ,
// 0๋ฒ์งธ ์์๋ ์ํ์ ๊ฐ์ ์ฝ์ ๋ ์ฐ๋ ๋ฐ์ดํฐ(ํ์ฌ state์ ๋ณ์),
// 1๋ฒ์งธ ์์๋ ์ํ์ ๊ฐ์ ๊ฐฑ์ ํ ๋ ์ฌ์ฉํ๋ ํจ์์ด๋ค.
const _mode = useState("init") // useState์ ์ธ์๋ state์ ์ด๊ธฐ๊ฐ
const mode = _mode[0]; // state์ ๊ฐ์ ์ฝ์
const setMode = _mode[1]; // state์ ๊ฐ์ ๋ฐ๊ฟ
-------------------------
โ๏ธ useState ์์
๐ฉ๐ป๐ป example 1
function Checkbox() {
const [isChecked, setIsChecked] = useState(false);
const handleChecked = (e) => {
console.log("clicked");
setIsChecked(e.target.checked)
}
return (
<div>
<input type="checkbox" checked={isChecked} onChange={handleChecked} />
<span>{isChecked ? "Checked" : "Unchecked"}</span>
</div>
)
}
๐ฉ๐ป๐ป example 2
function App() {
const [name, setName] = useState("Mike");
return (
<div>
<h1>state</h1>
<h2>{name}</h2>
<button onClick={() => {
setName(name === "Mike" ? "Elle" : "Mike");
}}>chnage</button>
</div>
)
}
๐พ ์ํ ๋์ด์ฌ๋ฆฌ๊ธฐ(Lifting State Up)
↓ ๋ฆฌ์กํธ ๊ณต์๋ฌธ์์ ์์๊ฐ ์ ๋์์์ผ๋ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ด๋ผ๋ ์์น์ ๋ฐ๋ผ ํ์ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ์ ํํ ํน์ ํ์ ์ด ๋ฌด์์ธ์ง๋ง ์ ์ ์๋ค. ๋ฐ์ดํฐ๊ฐ state๋ก๋ถํฐ ์๋์ง, ํ๋์ฝ๋ฉ์ผ๋ก ์ ๋ ฅํ ๋ด์ฉ์ธ์ง๋ ์์ง ๋ชปํ๋ค. ๊ทธ๋์ ํ์ ์ปดํฌ๋ํธ์์์ ์ด๋ค ์ด๋ฒคํธ๋ก ์ธํด ์์ ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ฐ๋๋ ๊ฒ์ ๋ง์น “์ญ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ”๊ณผ ๊ฐ์ด ์ด์ํ๊ฒ ๋ค๋ฆด ์ ์๋ค. React๊ฐ ์ ์ํ๋ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ๋ค.
์์ ์ปดํฌ๋ํธ์ “์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์” ๊ทธ ์์ฒด๋ฅผ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๊ณ , ์ด ํจ์๋ฅผ ํ์ ์ปดํฌ๋ํธ๊ฐ ์คํํ๋ค.
์ด๊ฒ์ด ์ํ ๋์ด์ฌ๋ฆฌ๊ธฐ์ด๋ค.
โ๏ธ ์ํ ๋์ด์ฌ๋ฆฌ๊ธฐ ๋ฐฉ๋ฒ
1. state๋ฅผ ๊ณตํต ๋ถ๋ชจ๋ก ์ด๋
2. ๊ณตํต ๋ถ๋ชจ๋ก๋ถํฐ props๋ฅผ ํตํด ์ ๋ณด ์ ๋ฌ
3. ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๋ฌํด ์์์์ ๋ถ๋ชจ์ state๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ๊ตฌํ
→ state๋ฅผ ๊ณตํต ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ๋ ํจ๋์ ์กฐ์ ํ ์ ์๊ฒ ํ๋ค. true์ false๋ฅผ ์ฌ์ฉํด ์ํ๋ฅผ ์ ์ดํ๋ ๊ฒ ๋์ ํ์ฑํ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํ ๋ฒ์ ํ๋์ ํจ๋๋ง ํ์ฑํ๋จ์ ๋ณด์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์ปดํฌ๋ํธ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ํ๋ค.
โ๏ธ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์๋ชป๋ ์ ๋ณด๋ ๋ ๊ณต์ ํ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
'Frontend Dev > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React์ Props Drilling๊ณผ ์ํ๊ด๋ฆฌ (0) | 2023.06.25 |
---|---|
React Hooks - useEffect (0) | 2023.05.31 |
React์ ๋ฐ์ดํฐ ํ๋ฆ - React๋ก UI๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋จ๊ณ (0) | 2023.05.30 |
React ๊ธฐ๋ณธ, props ์ฌ์ฉํ๊ธฐ (0) | 2023.05.23 |
React ๊ธฐ๋ณธ, JSX(JavaScript XML)์ JSX ๋ฌธ๋ฒ ๊ท์น ํ๋ฒ์ ์์๋ณด๊ธฐ (0) | 2023.05.18 |