๐ฌ ReactJS๋ก ์ํ ์น ์๋น์ค ๋ง๋ค๊ธฐ (03) - React์ State (1)
useState
React JS์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ์์ผ ์๋์ผ๋ก ๋ฆฌ๋ ๋๋ง์ ์ผ์ผํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ์ด์ฉ๋๋ค
์ด๋ ๊ฒ const data = React.useState();
๋ฅผ console.log
์ฐ์ด๋ณด๋ฉด
undefined
์ ํจ์๊ฐ ์ ํ ๋ฐฐ์ด์ด ์ฐํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค
undefined
๋ data
์ด๊ณ , f
๋ data
๋ฅผ ๋ฐ๊ฟ ๋ ์ฌ์ฉํ๋ ํจ์์ด๋ค
React.useState()
ํจ์๋ ์ด๊ธฐ๊ฐ์ ์ค์ ํ ์ ์์
์ฆ, undefined
๋ ์ด๊ธฐ๊ฐ! ย ย React.useState(0);
์ ํ๋ค๋ฉด ์ฝ์์๋ [0, ฦ]
๊ฐ ์ฐํ ๊ฒ์ด๋ค
๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์์์ธ f
๋ ๊ทธ ๊ฐ์ ๋ฐ๊พธ๋ ํจ์!
์ ๋ฆฌํ์๋ฉด,
React
์ useState
๋ ์ฐ๋ฆฌํํ
๋ฐฐ์ด ํ๋๋ฅผ ์ฃผ๋๋ฐ ๊ทธ ๋ฐฐ์ด์ ์ฒซ๋ฒ์จฐ ์์๋ ์ฐ๋ฆฌ๊ฐ ๋ด์ผ๋ ค๋ data
๊ฐ์ด๊ณ ,
๋๋ฒ์งธ ์์๋ ๊ทธ data
๊ฐ์ ๋ฐ๊ฟ๋ ์ฌ์ฉํ ํจ์์ด๋ค
๊ทธ๋ฆฌ๊ณ const
data
= React.useState(0);
๋์ const
[counter, setCounter]
= React.useState(0);
์ ์ค๋ค๋ฉด counter
์ setCounter
์ ๊ฐ๊ฐ 0
๊ณผ ฦ
๊ฐ ํ ๋น๋๊ฒ ๋๋ค!
๋ฐฉ๊ธ ๋งํ ๊ฒ ์ฒ๋ผ ๋ณดํต data
์๋ counter
์ฒ๋ผ ์ํ๋๋๋ก ๋ถ์ด๊ณ
ฦ
๋ set ๋ค์ ๋ฐ์ดํฐ ์ด๋ฆ์ ๋ถ์ฌ setCounter
๋ก ์ฌ์ฉํ๋ค
์ด๋ค๊ฐ์ ๋ถ์ฌํ๋ setCounter
ํจ์๋ ๊ทธ ๊ฐ์ผ๋ก ์
๋ฐ์ดํธํ๊ณ ๋ฆฌ๋ ๋๋ง ์ผ์ผํจ๋ค!
Vanilla JS ๐ React JS
๊ทธ๋ผ ์ด์ ๋ฒํผ์ ํด๋ฆญํ ๋งํผ count๊ฐ ์ฆ๊ฐ๋๋ ๊ฐ๋จํ ํ๋ก์ ํธ๋ก VanillaJS์ ReactJS๋ฅผ ๋น๊ตํด๋ณด์!
Total clicks: 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="en">
<body>
<h3 id="click">Total clicks: 0</h3>
<button id="btn">Click me</button>
</body>
<script>
let counter = 0;
const button = document.getElementById("btn");
const h3 = document.getElementById("click");
function handleClick() {
counter = counter + 1;
h3.innerText = `Total clicks: ${counter}`;
}
button.addEventListener("click", handleClick);
</script>
</html>
Vanilla JS์์๋ h3 ์ ์ฒด๊ฐ ์ ๋ฐ์ดํธ๋๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html lang="en">
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
const root = document.getElementById("root");
function App() {
const [counter, setCounter] = React.useState(0);
const onClick = () => {
setCounter(counter + 1);
};
return (
<div>
<h3>Total clicks: {counter}</h3>
<button onClick={onClick}>Click me</button>
</div>
);
}
ReactDOM.render(<App />, root);
</script>
</html>
React์์๋ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค !
์ฆ, React์์๋ state๊ฐ ๋ฐ๋ ๋๋ง๋ค ์ปดํฌ๋ํธ ์ ์ฒด๊ฐ rerendering์ด ์ผ์ด๋๋๋ฐ,
eventlistener๊ฐ ๋ฑ๋ก๋๊ฑฐ๋ Total clicks์ ๋ค์ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ, ์ค์ ๋ก ๋ฐ๋๋ ๊ฐ์ธ {counter}
์ด ๋ถ๋ถ๋ง ์
๋ฐ์ดํธ๋๋ค
React๋ state๊ฐ์ด ๋ฐ๋๋ฉด ์๋ก์ด ๊ฐ์ ๊ฐ์ง๊ณ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ค !!
โ ์ด๊ฒ ์ ์ข์๊ฑด๊ฐ?
Vanilla JS
์์๋ DOM ๋ณ๊ฒฝ์ ์ง์ ์ฒ๋ฆฌํ๋ค. ์ฆ, ํ์ํ DOM ์์๋ฅผ ์ง์ ์ ํํ๊ณ , ์์์ ์์ฑ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ์์๋ฅผ ์ ๊ฑฐํ๋ ๋ฑ์ ์์ ์ ์ง์ ์ํํ๋ค.
DOM ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ๋ณ๊ฒฝ๋ DOM ํธ๋ฆฌ๋ฅผ ๋ค์ ๊ณ์ฐํ๊ณ , ๋ ๋ ํธ๋ฆฌ๋ฅผ ๋ค์ ์์ฑํ ํ ํ๋ฉด์ ๊ทธ๋ฆฝ๋๋ค. ์ด ๊ณผ์ ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ฐ์ฐ์ผ๋ก, ์์ฃผ ๋ฐ์ํ๊ฒ ๋๋ฉด ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์์ต๋๋ค.- ๊ทธ๋ ์ง๋ง
React JS
๋ DOM ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ฐ์ DOM(Virtual DOM)์ด๋ผ๋ ๊ฐ๋ ์ ๋์ !
์ํ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ , ์ด์ ์ ๊ฐ์ DOM ํธ๋ฆฌ์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ํ์ ํ๋ค
์ด๋ ๊ฒ ํ์ ๋ ๋ณ๊ฒฝ ์ฌํญ๋ง ์ค์ DOM์ ๋ฐ์ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ, ์ด ๊ณผ์ ์ โ์ฌ์กฐ์ (Reconciliation)โ ๋๋ โDiffingโ์ด๋ผ๊ณ ํจ
๊ฐ์ DOM์ ์ฌ์ฉํจ์ผ๋ก์จ, ๋ณ๊ฒฝ์ด ํ์ํ ์ต์ํ์ ์์๋ง ์ค์ DOM์ ๋ฐ์๋๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ์ฐ์ฐ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค
๋ฐ๋ผ์, ReactJS
๋ ๋ณต์กํ UI ์
๋ฐ์ดํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์น์ ์๋ต์ฑ์ ํฅ์์ํค๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์๋ค!