๐ ์์ฝ: useState
const [state, setState] = useState( ์ด๊ธฐ๊ฐ );
state์๋ ํ์ฌ๊ฐ์ด ๋ค์ด๊ฐ๋ฉฐ, setState๋ก state๋ฅผ ์๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค.
๋ง์ฝ state๋ฅผ ๋ณ๊ฒฝํ ๋ ์ด์ state์ ๊ด๋ จ์ด ์๋ค๋ฉด, ๋ค์ ์ฝ๋์ฒ๋ผ
์ธ์๋ฅผ ์ด์ state (prevState)
return ๊ฐ์ ๋ณ๊ฒฝ๋๋ state (newState)
๋ก ์์ฑํ๋ ๊ฒ ์ข์ต๋๋ค.
setState((prevState) => {
// ...
return newState;
});
๐ ๊ณต๋ถ ๋ชฉ์
๋ฆฌ์กํธ๋ก ๊ฐ๋ฐํ ๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋ฆฌ์กํธ Hooks๋ผ๋ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๋์ค ์ปดํฌ๋ํธ๋ state๋ฅผ ์ด์ฉํ์ฌ ์ ๋ฐ์ดํธ, ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ฉด, ํจ์ ์ปดํฌ๋ํธ๋ state, ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ์ ๋ชปํ๊ธฐ ๋๋ฌธ์ hooks์ ์ด์ฉํฉ๋๋ค. ๊ฐ๊ณ ๋ฆฌ์ฒ๋ผ ์ฐ๊ณ ์ถ์ ๊ธฐ๋ฅ์ด ์์ ๋ ํจ์๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์ด hooks ๊ธฐ๋ฅ์ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋ ์์ฃผ ์ฌ์ฉ๋๋ฏ๋ก ๊ผญ ์ดํดํ๊ณ ๋์ด๊ฐ์ผ ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํด ๊น๊ฒ ๊ณต๋ถํ์ต๋๋ค.
๐ฃ useState
1. ์๊ณ ์ปดํฌ๋ํธ๋ก ์ค์ต
const [state, setState] = useState(์ด๊ธฐ๊ฐ);
useState ์ธ์์ ์ด๊ธฐ๊ฐ์ ๋ฃ์ผ๋ฉด, state์ setState๋ฅผ ๋ฐฐ์ด ํํ๋ก ๋ฆฌํดํด์ค๋๋ค. state์๋ ํ์ฌ ์ํ, setState๋ก state๋ฅผ ๊ฐํธํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์์๋ก ๊ฐ๋จํ ์๊ณ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค๊ณ ํฉ์๋ค. ๋ค์ ์ฝ๋์ฒ๋ผ ์ง๊ด์ ์ธ ์ด๋ฆ์ ์ธ ์ ์์ต๋๋ค.
const [time, setTime] = useState(5);
state์๋ ํ์ฌ ์๊ฐ(์ด๊ธฐ๊ฐ)์ธ 5๊ฐ ๋ค์ด๊ฐ๋ฉฐ 6์๋ก ์๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด setTime(6)๋ก state๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธํ๋ค๊ณ ํ๋ฉฐ ์ฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋๋ค.
create-react-app์ ์ฌ์ฉํ์ฌ ์๊ฐ์ด ๋ณด์ด๊ณ Update ๋ฒํผ์ ๋๋ฅด๋ฉด ์๊ฐ์ด ๋ฐ๋๋ ์๊ณ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
import { useState } from "react";
function App() {
const [time, setTime] = useState(1);
// ์ด๊ธฐ๊ฐ 1์๋ก ์ธํ
const handleClick = () => {
setTime(time + 1);
};
// ๋๋ฅด๋ฉด time์ + 1์ ํด์ฃผ๋ ํจ์ ์์ฑ
return (
<div>
<p>ํ์ฌ ์๊ฐ์ {time}์์
๋๋ค!</p>
<button onClick={handleClick}>Update</button>
</div>
);
}
export default App;
์ด๋ ๊ฒ ๋ฒํผ์ ๋๋ฅด๋ฉด 1์์์ 2์๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ค์ ๋ก ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ ๋๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ์ ๋ก๊ทธ๋ฅผ ์ด์ฉํ์ฌ ํ์ธํ ์ ์์ต๋๋ค.
์ฒซ ํ๋ฉด์ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋ ๋ ํ ๋ฒ, ๊ทธ๋ฆฌ๊ณ Update ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค ์ฝ์์ ์ ๋ฐ์ดํธ๊ฐ ๋์๋ค๊ณ ํ์๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด ์ปดํฌ๋ํธ์ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Update ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค time์ด + 1 ์ฉ ๋ํด์ง๊ธฐ ๋๋ฌธ์ ๊ณ์ ๋๋ฅธ๋ค๋ฉด ๋๋ ์์ด ์ซ์๊ฐ ์ฌ๋ผ๊ฐ๋๋ค. ๊ทธ๋์, time์ด 12์๊ฐ ๋์ด๊ฐ๋ฉด ๋ค์ 1์๋ก ๋ฐ๋๋๋ก ์ฝ๋๋ฅผ ์์ ํด๋ณด๊ฒ ์ต๋๋ค.
import { useState } from "react";
function App() {
const [time, setTime] = useState(1);
// ์ด๊ธฐ๊ฐ 1์๋ก ์ธํ
const handleClick = () => {
let newTime;
// newTime์ setTime ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ฐ๊ฟ ์๋ก์ด ์๊ฐ์
๋๋ค.
if (time >= 12) { // ๋ง์ฝ ํ์ฌ ์๊ฐ์ด 12์๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด, newTime์ 1๋ก
newTime = 1;
} else {
newTime = time + 1; // 12์๋ณด๋ค ์๋ค๋ฉด, newTime์ time + 1
}
setTime(newTime); // newTime์ผ๋ก ๋ณ๊ฒฝ
};
console.log("์
๋ฐ์ดํธ ๋์์ต๋๋ค");
return (
<div>
<p>ํ์ฌ ์๊ฐ์ {time}์์
๋๋ค!</p>
<button onClick={handleClick}>Update</button>
</div>
);
}
export default App;
์ด์ ์๊ณ์ฒ๋ผ ์ ์ ์๋์ ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
2. input ํ๊ทธ๋ก ์ ๋ ฅ๊ฐ ๋ฐ๊ณ ์ถ๋ ฅํ๊ธฐ
๋จผ์ , ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
import { useState } from "react";
function App() {
return (
<div>
<input type="text" />
<button>Upload</button>
</div>
);
}
export default App;
๋ค์์ฒ๋ผ div ํ๊ทธ ์์ input, button ํ๊ทธ๊ฐ ํ๋ฉด์ ๋ณด์ด๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด์ ์๋ก์ด input ๋ง๋ค state๊ฐ ์ ๋ฐ์ดํธ ๋๋๋ก useState๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค. state๊ฐ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ ๋๋์ง ํ์ธํ๊ธฐ ์ํด ์ค๊ฐ์ console.log(input)์ผ๋ก ํ์ธํ๊ฒ ์ต๋๋ค.
import { useState } from "react";
function App() {
const [names, setName] = useState(["Hyun", "Lily"]); // ์ด๊ธฐ๊ฐ ์ง์
const [input, setInput] = useState("");
const handleInputChange = (event) => {
setInput(event.target.value); // setInput ํจ์๋ก ๋ณ๊ฒฝํ๋ handleInputChange ํจ์ ์์ฑ, ์๋ก์ด input์ ์ง์
};
console.log(input); //input ๊ฐ ํ์ธ
return (
<div>
<input type="text" value={input} onChange={handleInputChange} />
{/* handleInputChange ํจ์ ์ฐ๊ฒฐ */}
<button>Upload</button>
{names.map((name, index) => { // map ํจ์ ์ฌ์ฉํ ๋์ key ๊ฐ ๋ฃ๊ธฐ! ์ฌ๊ธฐ์ ๊ฐ์ index๋ก ๋ฃ์ด์ฃผ์๋ค!
return <p key={index}>{name}</p>;
})}
</div>
);
}
export default App;
์ฝ์์ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ ํ๋๋ฅผ ์ ๋ ฅํ ๋๋ง๋ค state๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด์ ์ ๋ก๋ ๋ฒํผ์ ๋๋ฅด๋ฉด ํ๋จ์ ์ ๋ ฅํ input ๊ฐ์ ๋ณด์ฌ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
import { useState } from "react";
function App() {
const [names, setNames] = useState(["Hyun", "Lily"]);
const [input, setInput] = useState("");
const handleInputChange = (event) => {
setInput(event.target.value);
};
// Upload ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค handleUpload ํธ์ถ
const handleUpload = () => {
setNames((prevState) => {
// prevState๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฝ์ ํ์ธํ๊ธฐ
console.log(prevState);
return [input, ...prevState];
}); // ์ด์ ๊ฐ๊ณผ ๊ด๋ จ์ด ์์ ๋์๋ ๋งค๊ฐ๋ณ์๋ก prevState๋ฅผ, return์ ์ฒซ ๋ฒ์งธ ๊ฐ์ผ๋ก input๊ณผ ๊ทธ ๋ค์ ๊ฐ์ผ๋ก๋ ...prevState๋ฅผ ์ฌ์ฉํด์ฃผ์๋ค.
};
// console.log(input);
return (
<div>
<input type="text" value={input} onChange={handleInputChange} />
<button onClick={handleUpload}>Upload</button>
{names.map((name, index) => {
return <p key={index}>{name}</p>;
})}
</div>
);
}
export default App;
๐ ๋ง์ฝ useState๋ฅผ ์ฌ์ฉํ ๋, ์ด๊ธฐ์ ๋ฌด๊ฑฐ์ด ์์ ์ ํ๋ค๋ฉด?
์ฝ๋ฐฑํจ์ ์ด์ฉํด์ ์ฒ์ ๋ ๋๋ง ๋๋ง ์คํ๋๊ฒ ํ๊ธฐ!
์ด๊ธฐ์ ๋ฌด๊ฑฐ์ด ์์ ์ ์งํํ๊ฒ ๋๋ค๋ฉด, ์ฝ๋๊ฐ ๋นํจ์จ์ ์ ๋๋ค. ์์์ ์ด๊ธฐ๊ฐ์ ๋ ๋๋งํ ๋ ๋ฟ๋ง ์๋๋ผ ๊ทธ ์ดํ input์ state๋ฅผ ์ ๋ฐ์ดํธํ ๋๋ง๋ค ์ด์ ๊ฐ์ ๋ค์ ๋ถ๋ฌ์ค๊ฒ ๋๋๋ฐ, ๋ง์ฝ ์ด๊ธฐ๊ฐ์ด ๋ฌด๊ฑฐ์ด ๋ฐ์ดํฐ๋ผ๋ฉด ํจ์จ์ด ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค.
import { useState } from "react";
const heavyWork = () => {
console.log("๋ฌด๊ฑฐ์ด ์์
");
return ["Hyun", "Lily"];
};
function App() {
const [names, setNames] = useState(heavyWork());
const [input, setInput] = useState("");
const handleInputChange = (event) => {
setInput(event.target.value);
};
const handleUpload = () => {
setNames((prevState) => {
// console.log(prevState);
return [input, ...prevState];
});
};
// console.log(input);
return (
<div>
<input type="text" value={input} onChange={handleInputChange} />
<button onClick={handleUpload}>Upload</button>
{names.map((name, index) => {
return <p key={index}>{name}</p>;
})}
</div>
);
}
export default App;
๊ทธ๋์ ์ด๊ธฐ๊ฐ์ ๋ฃ์ด์ฃผ๋ ์ธ์์ ๋ฐ๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ฒ ์๋๋ผ, ์ฝ๋ฐฑ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋ ํจ์จ์ ์ผ๋ก ์ฝ๋๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
function App() {
const [names, setNames] = useState(() => {
return heavyWork();
});
์ด ์ฝ๋์ฒ๋ผ ๋ฆฌํด๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด, ์ฒ์ ๋ ๋๋ง๋ ๋๋ง "๋ฌด๊ฑฐ์ด ์์ "์ด ์ฝ์์์ ๋ํ๋ฉ๋๋ค.
์ฐธ๊ณ
'React.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ๋ฆฌ์กํธ Hooks (3) - useRef: DOM ์์ ์ ๊ทผ (0) | 2024.06.27 |
---|---|
[React] ๋ฆฌ์กํธ Hooks (3) - useRef: ๋ณ์ ๊ด๋ฆฌ (0) | 2024.06.26 |
[React] ๋ฆฌ์กํธ Hooks (2) - useEffect (0) | 2024.06.26 |