useState
ํ์ต ํค์๋
useState
initialState
state
setState
๋น๋๊ธฐ์ ์ผ๊ด์ฒ๋ฆฌ(batch)
ํด๋ก์ ์ ํ
๐ useState
state(์ํ)๋ฅผ ์์ฑํ๊ณ ์ ๋ฐ์ดํธ(setState)๋ฅผ ํตํด ํ๋ฉด(UI)์ (๋ฆฌ)๋ ๋๋งํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๐ค useState ์ฌ์ฉ๋ฒ
import { useState } from "react"; // ์ฌ์ฉ์ ์ํด import ํด์ค์ผ ํ๊ณ ,
const [state, setState] = useState(์ด๊ธฐ๊ฐ); // ํด๋น ์ฝ๋์ฒ๋ผ ์ต์์์ ์ ์ธํด์ค๋ค.
state ์์ฑ๊ณผ ๋์์ ๊ฐ์ ธ์ผ ํ ์ด๊ธฐ๊ฐ์ useState ํจ์์ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด state, setState ๋๊ฐ์ง์ ์์๋ฅผ ๋ฐฐ์ด ํํ๋ก ๋ฆฌํดํด์ค๋ค.
์ต์ด ๋ ๋๋ง์ state๋ ์ธ์๋ก ๋ฐ์ ์ด๊ธฐ๊ฐ์ ๊ฐ์ง๊ณ ์๊ณ , setState๋ state๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
useState(initialState)
import { useState } from 'react';
function MyComponent() {
const [age, setAge] = useState(28);
const [name, setName] = useState('Taylor');
const [todos, setTodos] = useState(() => createTodos());
}
๋งค๊ฐ๋ณ์ initialState ์ ์ํ์ ์ด๊ธฐ๊ฐ์ ์ง์ ํ๋ค.
๋งค๊ฐ๋ณ์๋ก ์ฝ๋ฐฑํจ์๋ ์ ์ธ์ด ๊ฐ๋ฅํ๋ค.
๋๊ท๋ชจ ๋ฐฐ์ด์ ์์ฑํ๊ฑฐ๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ ์ํํ๋ ๊ฒฝ์ฐ
state
const [form, setForm] = useState({
firstName: 'Barbara',
lastName: 'Hepworth',
email: 'bhepworth@sculpture.com',
});
// ์ง์ ์ ์ผ๋ก ๊ฐ์ ์
๋ ฅํ๊ฒ ๋๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์์.
form.firstName = "Taylor"
// setForm ์ํ๋ณํ ํจ์๋ฅผ ํตํ ๋ณ๊ฒฝ
setForm({
...form,
firstName: 'Taylor'
});
state๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด setState ํจ์๋ฅผ ํธ์ถํ๊ณ ์ธ์๋ก ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด state๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ state๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง(์ ๋ฐ์ดํธ)ํ๊ฒ ๋๋ค.
setState(nextState)
๋น๋๊ธฐ๋ก ๋์ํ์ฌ state๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ ํจ์์ด๋ค.
์ด์ ์ ์ํ๊ฐ์ ์ป๊ณ ์ถ๋ค๋ฉด ์ฝ๋ฐฑํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
import { useState } from 'react';
export default function Index() {
const [count, setCount] = useState(0);
const onClick = () => {
setCount(count + 1); // 0 + 1
setCount(count + 1); // 0 + 1
setCount(count + 1); // 0 + 1 <- ์ด ์ฝ๋๋ง ์ ์ฉ๋จ
console.log(count); // 0
};
return (
<div>
<p> ํ์ฌ state : {count}</p>
<button type="button" onClick={onClick}>
+3
</button>
</div>
);
}
์์ ์ฝ๋๋ฅผ ์คํ ๋ณด๋ฉด console.log(state)
๊ฐ์ ์ด์ ์ ์ํ๊ฐ์ธ 0์ด ์ถ๋ ฅ๋๊ณ , state ๊ฐ์ 1์ด๋ค.
โ ์ด๋ ๊ฒ ๋์ํ๋ ์ด์ ๋ setState ํจ์๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๊ณ React๊ฐ ํ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์ ๋ด์ ๋ก์ง์ ๋ชจ๋ ์ฝ์ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ๋ค์์ ์ผ๊ด ์ฒ๋ฆฌ(Batch)ํด ํ๋ฒ์ ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ค ์ React๋ ์ํ๊ฐ์ ๋ณ๊ฒฝํ๋ ํจ์๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ง๋ค์์๊น?
React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ง์ ์ปดํฌ๋ํธ์ ์ํ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค. ์ด๋ฐ ์ํฉ์์ ๋จ ํ๋์ ์ํ๊ฐ ๋ณํํ ๋๋ง๋ค ๊ด๋ จ๋ ๋ทฐ๋ฅผ ๋งค๋ฒ ๋ฆฌ๋ ๋๋งํ๋ ๊ฒ์ ๋นํจ์จ๊ณผ ํจ๊ป ์ฑ๋ฅ์์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๋ค.
๐ค ์ฐ์๋ setState๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์?
setStateํจ์์ ์ธ์๋ก ํจ์๋ฅผ ์ ๋ฌํ๋ค.
useEffect์ ์์กด์ฑ ๋ฐฐ์ด์ ํ์ฉํ๋ฉด ๋๋ค.
import { useState } from 'react';
export default function Index() {
const [count, setCount] = useState(0);
const onClick = () => {
setCount((count) => count + 1); // 0+1 count โ 1
setCount((count) => count + 1); // 1+1 count โ 2
setCount((count) => count + 1); // 2+1 count โ 3
console.log(count); // 0
};
return (
<div>
<p> ํ์ฌ state : {count}</p>
<button type="button" onClick={onClick}>
+3
</button>
</div>
);
}
๐ ์ฐธ๊ณ
Last updated