useState
๊ธฐ๋ณธ Hook์ ์ํ๋ useState
. ์ํ ์ ์ง ๊ฐ๊ณผ ๊ทธ ๊ฐ์ ๊ฐฑ์ ํ๋ ํจ์๋ฅผ ๋น๊ตฌ์กฐํ ํ ๋น์ ํตํด ๋ฐํํ๋ค. ์ฒ์ ๋ ๋๋ง์ด ๋ ์์ ์ ๋ฐํ๋ state ๊ฐ์ useState
์ด ๋ ๋ฒ์งธ ์ธ์ ๊ฐ๊ณผ ๊ฐ๋ค.
์ฝ๋ ์๋จ์ useState
๋ฅผ importํด์ค ๋ค, ํจ์ํ ์ปดํฌ๋ํธ ๋ด๋ถ์ const \[value, setValue\] = useState(0);
๋ก value
์ ์ด๊ธฐ ์ํ๊ฐ์ useState
์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด 0์ผ๋ก ์ด๊ธฐํํด์ค๋ค. ์ดํ, +1, -1์ด๋ผ๋ ๋ฒํผ์ ํด๋ฆญํ์ ๋๋ setValue
ํจ์๋ฅผ ํตํด ๊ธฐ์กด value
์ 1์ ๋ํ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก, ์ํ๋ฅผ ์
๋ฐ์ดํธํด์ค๋ค. setValue
ํจ์๋ ์๋ก์ด state ๊ฐ์ ์ธ์๋ก ๋ฐ์ ์ปดํฌ๋ํธ Re-rendering์ ์ํจ๋ค. ์ดํ ๋ ๋๋ง๋ state ๊ฐ์ ์
๋ฐ์ดํธ๋ state ๊ฐ์ด๋ค.
useState
๋ ํ์ํ ๋งํผ ์ ์ธํด ์ฌ์ฉํ ์ ์๊ณ , useState
๋ฌธ๋ฒ์ด ๋ฏ์ค๋ค๋ฉด ๋น๊ตฌ์กฐํ ํ ๋น(Destructuring Assignment)์์ ํ์ธํ ์ ์๋ค. -> Reference์ ๋งํฌ ํ์ธ
useEffect
useEffect๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค (๋ค์ํ ์กฐ๊ฑด ํ์) ํน์ ์์ ์ ์ํํ๋๋ก ํด์ฃผ๋ Hook์ด๋ค. ํด๋์คํ ์ปดํฌ๋ํธ์์ componentDidMount๋ componentDidUpdate๋ฅผ ํฉ์น ์ํ์ด๋ค. (๋ฐ๋ผ์ ๋ค์ํ ์กฐ๊ฑด์ผ๋ก useEffect๋ฅผ ๋ค๋ฅด๊ฒ ์คํํ ์ ์๋ ๊ฒ์ด๋ค.)
์ ์ฝ๋์์๋ ๋ ๋๋ง ์ดํ 'Rendered'๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋๋๋ก ํ๋ค. ๋ ๋๋ง๋ ๋๋ง๋ค ์ด ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค. ๋ง์ผ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋ ์์ ์๋ง ์คํ๋๋ ํจ์๋ฅผ ์ฐ๊ณ ์ ํ๋ค๋ฉด (์ ๋ฐ์ดํธ๋ ๋ ํด๋น ์์ ์ ๋ฌด์๋๋ค.) useEffect์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋น ๋ฐฐ์ด์ ๋ฃ์ด์ค๋ค.
useEffect(() => {
console.log('Rendered');
console.log(name);
}, []);
์ฒ์ ๋ ๋๋ง๋ ์ดํ(์ฆ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ง์ดํธ๋ ์ดํ)์ ํน์ ๊ฐ์ด ๋ฐ๋ ๋๋ง ์คํ๋๋๋ก ํ๊ณ ์ถ๋ค๋ฉด ๋น ๋ฐฐ์ด์ ์ฝ์ ํ๋ ๋์ Watchํ๊ณ ์ ํ๋ ๊ฐ์ ๋น ๋ฐฐ์ด์ ๋ฃ์ด์ค๋ค.
useEffect(() => {
console.log('Rendered');
console.log(name);
}, [name]);
useEffect
๋ก๋ cleanup
ํจ์๋ฅผ ์ธ ์๋ ์๋ค. cleanup
ํจ์๋ ์ปดํฌ๋ํธ๊ฐ unmount
๋๊ธฐ ์ง์ , ํน์ ์
๋ฐ์ดํธ๋๊ธฐ ์ง์ ์ ์ํํ๋ ์์
์ ๋งํ๊ณ , return์ ํตํด ๋ฐํํ๋ค.
์ ์ฝ๋์๋ 'cleanup'์ด๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๋ cleanup ํจ์๊ฐ ๋ฐํ๋๊ณ ์๋ค. update๋ ๋๋ง๋ค cleanup์ ํ๊ณ ์ถ์ง ์๋ค๋ฉด(=unmount ์์๋ง ๋์ํ๊ณ ์ ํ๋ค๋ฉด) ์๊น์ฒ๋ผ useEffect
hook์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋น ๋ฐฐ์ด์ ์ฝ์
ํ๋ค.
useReducer
Redux๋ฅผ ๊ณต๋ถํ ๋๋ ๋ฑ์ฅํ๋ Reducer. Redux๊ฐ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๋งํผ useReducer Hook๋ ์ฌ๋ฌ ์ํ๋ฅผ ๋ค์ํ ์ํฉ์์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ ์ ํ ๋ ์ฐ์ธ๋ค๋ ๊ฐ๋ ์ด๋ค. useReducer๋ ํ์ฌ ์ํ๋ฅผ ๋งํ๋ state, ์ ๋ฐ์ดํธ๋ฅผ ๋์์ํค๊ธฐ ์ํ action, ๊ทธ๋ฆฌ๊ณ ์ด ์ก์ ์ ๋ฐ์์ํค๋ dispatch๊ฐ ํ์ํ๋ค. ํ์ฌ ์ํ๋ฅผ ์ ์งํ๊ณ , ๋ฐ๋๋ ์ฌ๋ฌ ์ํ๋ฅผ ์ถ์ ๋ฐ ๊ด๋ฆฌํ๊ธฐ ์ํด action์ด๋ผ๋ ๊ฐ๋ ์ด ์กด์ฌํ๋ค. Vue๋ฅผ ๊ณต๋ถํ ๋ Vuex์์ mutation, commit ๋ฑ์ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.
๊ฐ์ฅ ์ฒ์ useState
๋ฅผ ์ด์ฉํด Counter๋ฅผ ๊ตฌํํ ๊ฒ์ useReducer
๋ก ๊ตฌํํ ์ ์๋ค.
CounterReducer ํจ์ํ ์ปดํฌ๋ํธ ์๋์ useReducer ํจ์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์๋ ์์ฑํ reducer ํจ์, ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์๋ ์ด๊ธฐ๊ฐ ์ ์ธ์ด ๋ค์ด๊ฐ๋ค. ์ด๋ฅผ ํตํด state
, dispatch
๋ฅผ ๋ฐ์์ ์ ์ธํ ์ ์๋ค. dispatch
๋ ์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ก์
์ ๋ฐ์์ํจ๋ค. dispatch(action)
์ฒ๋ผ ์ฌ์ฉ๋๋ฉฐ, ์คํ ์ Reducer ํจ์๊ฐ ํธ์ถ๋๋ค.
useReducer๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ ์
๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ ์ธ๋ถ๋ก ๋นผ๋ด ์์ฑํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค. ๋ ๋จ์ผํ ๋ฌธ์๋ ์ซ์ ๊ฐ์ ๋จ์ ๋ฐ์ดํฐ ์ด์ธ์ ๋ณด๋ค ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ฌ์์ง๋ค. ์ด๋ฅผ ์ํด useEffect
์์ ๋ฅผ ์ํด ์์ฑํ Info.js ์ปดํฌ๋ํธ๋ก ๋์๊ฐ๋ณด์.
InfoReducer ์ปดํฌ๋ํธ ์ธ๋ถ์ state, action
์ ๊ฐ๋ reducer ํจ์๋ฅผ ์์ฑํ๋ค. rest ...
syntax๋ฅผ ์จ์ ๊ธฐ์กด์ state๋ฅผ ๊ฐ์ง๊ณ ์ค๊ณ ์๋ค. action์ name์ key์, value๋ value์ ํ ๋นํ๋ค.
InfoReducer ์ปดํฌ๋ํธ ๋ด๋ถ์์ useReducer๋ reducer๋ฅผ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ง๋ฉฐ, ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ฒด ๋ด name, nickname์ ์ด๊ธฐ๊ฐ์ ๊ฐ๊ฐ ๋น ๋ฌธ์์ด๋ก ์ ์ธํด์ค๋ค.
๊ธฐ์กด Info ์ปดํฌ๋ํธ๋ input์ ๊ฐ์์ ๋ฐ๋ผ onChange ์ด๋ฒคํธ๋ฅผ ๊ฐ๊ฐ ๋ฐ๋ก ๋ง๋ค์ด์ฃผ์์ง๋ง, useReducer๋ฅผ ์ฌ์ฉํด ์ฝ๋๋ฅผ ๋ณด๋ค ์งง๊ฒ ์ค์ฌ ๊น๋ํ๊ฒ ์ ์ ์๋ ์๋ค. dispatch(action)
ํํ๋ก ์์ฑํ๊ณ , action
์ ๋ฐ์์ํค๋๋ฐ, ์ฌ๊ธฐ์ e.target
, ์ฆ input ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ target ์์ฒด๋ฅผ action์ผ๋ก ์ผ๊ณ ์๋ค.
์ปดํฌ๋ํธ ์ธ๋ถ์์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ์กด์ฌํ๋ useReduce. ์ด ํ ์ ์ด์ฉํ๋ฉด ๋ค๋ฅธ ํ์ผ์ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง๊ตฌํํ๊ณ , ์ด๋ฅผ ๋ถ๋ฌ ์ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํด์ง๋ค.
- ๊ด์ต์ ์ผ๋ก action์ ์ฃผ๋ก type ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด ํํ๋ก ์ฌ์ฉํ๊ณ , type์ ๋๋ฌธ์๋ก ๊ตฌ์ฑ๋๋ค. ์์ CounterReducer.js ์์ค์์๋ INCREMENT ์ฒ๋ผ ๋๋ฌธ์๋ก ์์ฑ๋์๋ค.
- ์ปดํฌ๋ํธ์์ ๊ด๋ฆฌํ๋ ๊ฐ์ด ํ๋๋ผ๋ฉด, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ์ด ๋จ์ผํ ๋ฌธ์์ด์ด๋ ์ซ์๋ผ๋ฉด
useState
๊ฐ ๋ซ๋ค. - ํ์ง๋ง ์ฌ๋ฌ ๊ฐ์ ํ์๊ฐ์ ๊ฐ๋ ๋ณต์กํ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ผ๋ฉด
useReducer
๊ฐ ์ํ ๊ด๋ฆฌ์ ๋ ๋ซ๋ค.
Reference
velog.io/@velopert/react-hooks
๋น๊ตฌ์กฐํ ํ ๋น_๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ_ํํ ๋ฆฌ์ผ
Hooks API Reference