๐์ค๋ ๋ฐฐ์ด ๊ฒ
State as a Snapshot!
state๋ setState๋ฅผ ํ ํ ๋ฐ๋ก ์ ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ ๋ณ๊ฒฝ๋ ๊ฐ์ ๋ค์ ๋ ๋๋ง ๋ ์ ์ฉํ๋ค. ๋ฐ๋ผ์ ํ ํจ์๋ด์์ setState ํ ๋ณ๊ฒฝ๋ ๊ฐ์ ์ฌ์ฉํ๋ ค ํ๋ค๋ฉด ์๋๋๋ก ๋์ํ์ง ์๋๋ค!
์ฆ, ํจ์๊ฐ ํธ์ถ๋ ๋์ ํ์ฌ state์ ๋ํ snapShot์ ์ฐ์ด์ ์ ์ฅํ๊ณ ํด๋น ๊ฐ์ ํ์ฉํด์ ํจ์๋ฅผ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ฌ๋ ๋๋ง๋ ๋ ์ ๋ฐ์ดํธ ๋ state๊ฐ์ ๋ฐ์ํ๋ ๊ฒ!
Queueing a Series of State Updates
๋ฆฌ์กํธ๋ state ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ชจ๋ ์ฝ๋๊ฐ ์คํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ํ๋ฒ์ ์คํ๋๋ค. ์ด๋ ๊ฒ ๋ฌถ์ด์ ์งํํ๋ฉด ๋ง์ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์๋ค. ํด๋ฆญ ์ด๋ฒคํธ ๊ฐ์ ์๋์ ์ธ ์ด๋ฒคํธ๋ ์ผ๊ด ์ฒ๋ฆฌํ์ง ์์! ํด๋ฆญ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
state๋ ์ค๋ ์ท์ฒ๋ผ ์ ์ฅ๋๋ค๊ณ ํ๋๋ฐ ๊ทธ๋ผ ๋ค์ ๋ ๋๋ง ์ ์ state๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋ ๊ฑธ๊น. ๊ทธ ๋ state์ ์ด์ ๊ฐ์ ์ด์ฉํ ์ ์๋ค. setState(p => p + 1) ์ด๋ฐ ์์ผ๋ก ํ๋ ๊ฒฝ์ฐ ํ์ ์ด์ ๊ฐ์ ์ฐธ์กฐํ์ฌ ์ ๋ฐ์ดํธ๊ฐ ์ผ์ด๋๊ฒ ๋๋ค.
export default function Counter() {
const [number, setNumber] = useState(0);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(n => n + 1);
setNumber(n => n + 1);
setNumber(n => n + 1);
}}>+3</button>
</>
)
}
๋ฐ๋ผ์ ์ด๋ฌํ ์ฝ๋์ผ ๋ setNumber(number + 1) ์ด์๋ค๋ฉด ๋ฒํผ์ ํ ๋ฒ ๋๋ ์ ๋ 3์ด ์๋๋ผ 1๋ก ๋ ๋๋ง๋ ๊ฒ์ด๋ค. ์๋ํ๋ฉด ์ค๋ ์ท์ฒ๋ผ ์ ์ฅ๋ ์ด๊ธฐ state๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ฐ์ดํธ๋๊ธฐ ๋๋ฌธ์! ํ์ง๋ง setNumber(n => n + 1)์ ํ ๊ฒฝ์ฐ ์ด์ ๊ฐ์ ์ฐธ์กฐํ์ฌ ์ ๋ฐ์ดํธ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ 3์ผ๋ก ๋ ๋๋ง๋๊ฒ ๋๋ค.
queued update | n | returns |
n => n + 1 | 0 | 0 + 1 = 1 |
n => n + 1 | 1 | 1 + 1 = 2 |
n => n + 1 | 2 | 2 + 1 = 3 |
ํ์์๋ ์ด๋ฐ ์์ผ๋ก ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ!!
๐ญ๋ฐฐ์ด ์
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ state์ ๋์์๋ฆฌ์ ๋ํด ์ ๋๋ก ์ดํดํ์ง ๋ชปํด์ ์ ๋จน์๋ ์ ์ด ์์๋ค. ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์ setState๋ก state์ ๊ฐ์ ์ ๋ฐ์ดํธํด์ฃผ๊ณ ๊ทธ ๊ฐ์ ํ์ฉํด์ ๋ฐ๋ก ๋ก์ง์ ์์ฑํ๋ฉด ๋๊ฒ ์ง?! ํ์ง๋ง ๋น์ฐํ๋ ๊ณ์ ์ด์ ๊ฐ์ด ๋จ์์์๋ค. ๊ทธ ๋๋ ์ด์ ๋ฅผ ์ฐพ์๋ณด๋ค๊ฐ state๊ฐ ๋ฐ๋ก ๊ฐ์ด ์ ๋ฐ์ดํธ ๋๋ ๊ฑด ์๋๊ตฌ๋! ํ๊ณ ๋์ด๊ฐ์๋๋ฐ ์ด๋ฒ์ ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ํ์คํ ์๊ฒ๋์ด ๊ธฐ์๋ค.
setState์ ์ด์ ๊ฐ์ ํ์ฉํ๋ ๊ฒ๋ ํ๋ก์ ํธ์์ ๋ค๋ฅธ ํ์์๊ฒ ๋ฐฐ์ ๋๋ฐ ์ ํํ ์ด๋จ ๋ ์ ์ด๋ ๊ฒ ์ฌ์ฉํด์ผํ๋์ง ๋ชฐ๋์๋ค. ๊ทธ๋ฐ๋ฐ ์ญ์ ๋ต์ ๊ณต์๋ฌธ์์ ์์๊ตฌ๋! ๊ณต์๋ฌธ์๋ฅผ ์ด์ฌํ ์ฝ์!
์ ๋งคํ๊ฒ ์์๋ ๊ฒ, ํน์ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์ ์ดํ์ ๋ค์ ๊ณต๋ถํ์ ๋ ์ดํด๊ฐ ๋๋ฉด ๊ทธ๊ฒ๋งํผ ๊ธฐ์ ๊ฒ ์๋ค. ๋ฌผ๋ก ์ง๊ธ๋ ์๋ฒฝํ ์ดํด๋ ์๋๊ฒ ์ง๋ง.. ์ฒ์์๋ ์ด๊ฒ ๋ฌด์จ ์๋ฆฌ์ง?? ์ง์ง ๋ชจ๋ฅด๊ฒ ๋ค ์ฌ๋ฅ์ด์๋... ํ๋ ๋ด์ฉ๋ค์ด ์๋ฒฝํ๋ ์๋์ด๋ ์ ์ด๋ฐ๊ฑฐ๊ตฌ๋! ํ๊ณ ์ดํด๊ฐ ๋๋๊น ๊ทธ๋๋ ์ด๋งํผ ์ดํดํ๊ณ ์๊ฐํ ์ ์๊ฒ ๋๊ตฌ๋~ ์ถ๋ค!
์กฐ๊ธ์ฉ ๋ ์ด์ฌํํด๋ณด์~
'์ผ์ > Today I Learned' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2023.04.26[์น ์ ๊ทผ์ฑ ๋ฆฌํฉํ ๋ง ์ค] (0) | 2023.04.26 |
---|---|
2023.04.25[๋ณ์, ๋ ์์ปฌ ์ค์ฝํ, ์น ์ ๊ทผ์ฑ] (0) | 2023.04.25 |
2023.04.21[์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ๋ฉด์ ์คํฐ๋] (0) | 2023.04.21 |
2023.04.20[DFS] (0) | 2023.04.20 |
2023.04.18[๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ๋ฉด์ ์ฐ์ตํ๊ธฐ] (0) | 2023.04.19 |
๐์ค๋ ๋ฐฐ์ด ๊ฒ
State as a Snapshot!
state๋ setState๋ฅผ ํ ํ ๋ฐ๋ก ์ ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ ๋ณ๊ฒฝ๋ ๊ฐ์ ๋ค์ ๋ ๋๋ง ๋ ์ ์ฉํ๋ค. ๋ฐ๋ผ์ ํ ํจ์๋ด์์ setState ํ ๋ณ๊ฒฝ๋ ๊ฐ์ ์ฌ์ฉํ๋ ค ํ๋ค๋ฉด ์๋๋๋ก ๋์ํ์ง ์๋๋ค!
์ฆ, ํจ์๊ฐ ํธ์ถ๋ ๋์ ํ์ฌ state์ ๋ํ snapShot์ ์ฐ์ด์ ์ ์ฅํ๊ณ ํด๋น ๊ฐ์ ํ์ฉํด์ ํจ์๋ฅผ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ฌ๋ ๋๋ง๋ ๋ ์ ๋ฐ์ดํธ ๋ state๊ฐ์ ๋ฐ์ํ๋ ๊ฒ!
Queueing a Series of State Updates
๋ฆฌ์กํธ๋ state ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ชจ๋ ์ฝ๋๊ฐ ์คํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ํ๋ฒ์ ์คํ๋๋ค. ์ด๋ ๊ฒ ๋ฌถ์ด์ ์งํํ๋ฉด ๋ง์ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์๋ค. ํด๋ฆญ ์ด๋ฒคํธ ๊ฐ์ ์๋์ ์ธ ์ด๋ฒคํธ๋ ์ผ๊ด ์ฒ๋ฆฌํ์ง ์์! ํด๋ฆญ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
state๋ ์ค๋ ์ท์ฒ๋ผ ์ ์ฅ๋๋ค๊ณ ํ๋๋ฐ ๊ทธ๋ผ ๋ค์ ๋ ๋๋ง ์ ์ state๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋ ๊ฑธ๊น. ๊ทธ ๋ state์ ์ด์ ๊ฐ์ ์ด์ฉํ ์ ์๋ค. setState(p => p + 1) ์ด๋ฐ ์์ผ๋ก ํ๋ ๊ฒฝ์ฐ ํ์ ์ด์ ๊ฐ์ ์ฐธ์กฐํ์ฌ ์ ๋ฐ์ดํธ๊ฐ ์ผ์ด๋๊ฒ ๋๋ค.
export default function Counter() {
const [number, setNumber] = useState(0);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(n => n + 1);
setNumber(n => n + 1);
setNumber(n => n + 1);
}}>+3</button>
</>
)
}
๋ฐ๋ผ์ ์ด๋ฌํ ์ฝ๋์ผ ๋ setNumber(number + 1) ์ด์๋ค๋ฉด ๋ฒํผ์ ํ ๋ฒ ๋๋ ์ ๋ 3์ด ์๋๋ผ 1๋ก ๋ ๋๋ง๋ ๊ฒ์ด๋ค. ์๋ํ๋ฉด ์ค๋ ์ท์ฒ๋ผ ์ ์ฅ๋ ์ด๊ธฐ state๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ฐ์ดํธ๋๊ธฐ ๋๋ฌธ์! ํ์ง๋ง setNumber(n => n + 1)์ ํ ๊ฒฝ์ฐ ์ด์ ๊ฐ์ ์ฐธ์กฐํ์ฌ ์ ๋ฐ์ดํธ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ 3์ผ๋ก ๋ ๋๋ง๋๊ฒ ๋๋ค.
queued update | n | returns |
n => n + 1 | 0 | 0 + 1 = 1 |
n => n + 1 | 1 | 1 + 1 = 2 |
n => n + 1 | 2 | 2 + 1 = 3 |
ํ์์๋ ์ด๋ฐ ์์ผ๋ก ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ!!
๐ญ๋ฐฐ์ด ์
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ state์ ๋์์๋ฆฌ์ ๋ํด ์ ๋๋ก ์ดํดํ์ง ๋ชปํด์ ์ ๋จน์๋ ์ ์ด ์์๋ค. ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์ setState๋ก state์ ๊ฐ์ ์ ๋ฐ์ดํธํด์ฃผ๊ณ ๊ทธ ๊ฐ์ ํ์ฉํด์ ๋ฐ๋ก ๋ก์ง์ ์์ฑํ๋ฉด ๋๊ฒ ์ง?! ํ์ง๋ง ๋น์ฐํ๋ ๊ณ์ ์ด์ ๊ฐ์ด ๋จ์์์๋ค. ๊ทธ ๋๋ ์ด์ ๋ฅผ ์ฐพ์๋ณด๋ค๊ฐ state๊ฐ ๋ฐ๋ก ๊ฐ์ด ์ ๋ฐ์ดํธ ๋๋ ๊ฑด ์๋๊ตฌ๋! ํ๊ณ ๋์ด๊ฐ์๋๋ฐ ์ด๋ฒ์ ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ํ์คํ ์๊ฒ๋์ด ๊ธฐ์๋ค.
setState์ ์ด์ ๊ฐ์ ํ์ฉํ๋ ๊ฒ๋ ํ๋ก์ ํธ์์ ๋ค๋ฅธ ํ์์๊ฒ ๋ฐฐ์ ๋๋ฐ ์ ํํ ์ด๋จ ๋ ์ ์ด๋ ๊ฒ ์ฌ์ฉํด์ผํ๋์ง ๋ชฐ๋์๋ค. ๊ทธ๋ฐ๋ฐ ์ญ์ ๋ต์ ๊ณต์๋ฌธ์์ ์์๊ตฌ๋! ๊ณต์๋ฌธ์๋ฅผ ์ด์ฌํ ์ฝ์!
์ ๋งคํ๊ฒ ์์๋ ๊ฒ, ํน์ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์ ์ดํ์ ๋ค์ ๊ณต๋ถํ์ ๋ ์ดํด๊ฐ ๋๋ฉด ๊ทธ๊ฒ๋งํผ ๊ธฐ์ ๊ฒ ์๋ค. ๋ฌผ๋ก ์ง๊ธ๋ ์๋ฒฝํ ์ดํด๋ ์๋๊ฒ ์ง๋ง.. ์ฒ์์๋ ์ด๊ฒ ๋ฌด์จ ์๋ฆฌ์ง?? ์ง์ง ๋ชจ๋ฅด๊ฒ ๋ค ์ฌ๋ฅ์ด์๋... ํ๋ ๋ด์ฉ๋ค์ด ์๋ฒฝํ๋ ์๋์ด๋ ์ ์ด๋ฐ๊ฑฐ๊ตฌ๋! ํ๊ณ ์ดํด๊ฐ ๋๋๊น ๊ทธ๋๋ ์ด๋งํผ ์ดํดํ๊ณ ์๊ฐํ ์ ์๊ฒ ๋๊ตฌ๋~ ์ถ๋ค!
์กฐ๊ธ์ฉ ๋ ์ด์ฌํํด๋ณด์~
'์ผ์ > Today I Learned' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2023.04.26[์น ์ ๊ทผ์ฑ ๋ฆฌํฉํ ๋ง ์ค] (0) | 2023.04.26 |
---|---|
2023.04.25[๋ณ์, ๋ ์์ปฌ ์ค์ฝํ, ์น ์ ๊ทผ์ฑ] (0) | 2023.04.25 |
2023.04.21[์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ๋ฉด์ ์คํฐ๋] (0) | 2023.04.21 |
2023.04.20[DFS] (0) | 2023.04.20 |
2023.04.18[๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ๋ฉด์ ์ฐ์ตํ๊ธฐ] (0) | 2023.04.19 |