๐ useReducer
useState()์ ๊ฐ์ ์ํ ๊ด๋ฆฌ, ์ํ ์ ๋ฐ์ดํธ ํ (Hook)์ด๋ค.const [state, dispatch] = useReducer(reducer, initialState);
- state : ์ํ ์ด๋ฆ (์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ํ)
- dispatch :ย ์ํ(state) ๋ณ๊ฒฝ ์ ํ์ํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ํจ์
- reducer :ย dispatch๋ฅผ ํ์ธํด์ state๋ฅผ ๋ณ๊ฒฝํด ์ฃผ๋ ํจ์
- initialState :ย state์ ์ ๋ฌํ ์ด๊ธฐ ๊ฐ์ผ๋ก ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ ๋ค์ํ ๊ฐ์ผ๋ก ์ ๋ฌ ๊ฐ๋ฅ
๊ทธ๋ฐ๋ฐ ์์น๋ฅผ ์ข ํด๋ณด๋ useReducer๋ React๋ง์ ์ฌ์ฉํ ๋ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ ์ ๊ณ , Redux๋ฅผ ์ด์ฉํ ์ํ๊ด๋ฆฌ๋ฅผ ์งํํ ๋ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒ ๊ฐ๋ค.
(+) ๊ทธ ์ด์ ๊ฐ ๋ฆฌ๋์ค๊ฐ ์ถ๊ตฌํ๋ ๋ฐฉํฅ, ์ฌ์ฉ๋ฒ์ด ๋น์ทํด์ ๊ทธ๋ฐ ๊ฒ ๊ฐ๋ค๋ ์๊ฒฌ๋ ์์๋ค.
https://ccomccomhan.tistory.com/281 ์์ ์ดํดํ๊ธฐ ์ ์ค๋ช ํด๋ฌ์ ์ฐธ๊ณ ํด์ ์์ฑํด๋ณด๋๋ก ํ๊ฒ ๋ค!
const [state, dispatch] = useReducer(reducer, initialState);
โ state ๐ ๋นต ์ฌ๋ฃ ๋ด๋ ์ ์
: ์ํ ์ด๋ฆ (์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ํ)
โ dispatch ๐ ์ฃผ๋ฌธ์
: ์ํ(state)๋ฅผ ๋ณ๊ฒฝ ์ ํ์ํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ 'ํจ์'
โ reducer ๐ ์ ์
: dispatch๋ฅผ ํ์ธํด์ state๋ฅผ ๋ณ๊ฒฝํด ์ฃผ๋ 'ํจ์'
โ initialState ๐ ๋นต ์ฌ๋ฃ
: state์ ์ ๋ฌํ ์ด๊ธฐ ๊ฐ
const [state, dispatch] = useReducer(reducer, 3);
๐ ๋นต ์ ์ ์์ฒญ์
: "๋นต ์ฌ๋ฃ๋ฅผย ์ฒ์์๋ย 3๊ฐ๋ก ํด์ผ์ง~ย (initialState)"ย โ "๋ค ๊ณจ๋์ผ๋ ์ ์์ ๋ฃ์ด์ผ๊ฒ ๋ค!(state)"ย
๐จโ๐ณ๐ณย ์ฃผ๋ฐฉ์ฅ
:ย "๋ค๋ค ์ฃผ๋ชฉ! ์ฐ๋ฆฌ ์ฃผ๋ฐฉ์ ์ ํด์ง ์ฃผ๋ฌธ์(dispatch)๋๋ก๋ง ์ ์(reducer)ํ๋ค! ์๊ฒ ๋?"
๐ง๐ง๐ปโ๐ณย ์ฃผ๋ฐฉ์๋ค
: "๋ต!"ย
๊ทธ๋ฐ๋ฐ dispatch, reducer๋ ๋ด๊ฐ ๋ง๋ ์ ์ด ์๋๋ฐ ๋ญ๊น?
๐จ๐ปโ๐ณ๐ณ reducer( )์ action
- reducer( )๋ 2๊ฐ์ง ์ธ์๋ฅผ ๋ฐ์.
- state
์์์ ์ ์ธํ state๊ฐ์ด ๋ค์ด๊ฐ๋ค. (์ด๊ธฐ ๊ฐ์ ๋น์ฐํ initialState์์ ์ค์ ํ ๊ฐ)- action
์ ๋ฐ์ดํธ๋ฅผ ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด. ์ฆ, ์์์ ์ ์ธํ dispatch(์ฃผ๋ฌธ์)
function reducer(state, action) {
switch (action.type) {
case 'PLUS':
return state + 1;
case 'MINUS':
return state - 1;
default: return state;
}
}
๐จโ๐ณ๐ณย ์ฃผ๋ฐฉ์ฅ
:ย "์ฐ๋ฆฌ ์ฃผ๋ฐฉ์ ์ฃผ๋ฌธ์(dispatch) ์ ์ฃผ๋ฌธ๋ด์ญ์ด 'PLUS'๋ผ๋ฉด ์ด๋ ํ ์ฌ๋ฃ(state)๊ฐ ์ค๋๋ผ๋ ๋ฌด์กฐ๊ฑด + 1ํด ์๊ฒ ์ด!?"
๐ง๐ง๐ปโ๐ณย ์ฃผ๋ฐฉ์๋ค
: "๋ต!"ย
๐จโ๐ณ๐ณย ์ฃผ๋ฐฉ์ฅ
:ย "์ด๊ฒ์ด ๋ด๊ฐ ์ ์ด๋์ ์ ์กฐ ๋ฐฉ์(reducer)์ด๋ ์ ์ด๋์ ๋๋ก๋ง ์คํํ๋ ๋ง์ด์ผ!ย ์๊ฒ ์ด!?"
๐ action๊ฐ์ฒด (dispatch)
action๊ฐ์ฒด dispatch๋ ์ ๋น์ ์์ ๋ก ์ค๋ช ํ์๋ฉด, '๋นต ์ฃผ๋ฌธ์๊ฐ ์ฃผ๋ฐฉ์ ์ ๋ฌํ ย ์ฃผ๋ฌธ์'๋ผ๊ณ ํ ์ ์๋ค.
- reducer( )์ ์ ์ด๋จ๋ type์(์ฃผ๋ฌธ ๋ช ๋ น์ด) ์ ๋๋ค.
- reducer์์ ํ์ํ ๋ฐ์ดํฐ, ๋ฐ์ดํฐ ๊ฐ(๋นต ์ฌ๋ฃ๋ค)๋ ๊ฐ์ด ์ ๋ฌํ ์ ์๋ค.
- ํ์ ๊ท์น์ ์๋๋ ์๋ฌต์ ๊ตญ๋ฃฐ๋ก 'type ์ ์ก์ (๊ฐ)์ ๋๋ฌธ์์ '_'๋ก ๊ตฌ์ฑํ๋ค.
// 1์ ๋ํ๋ ์ก์
(์ฃผ๋ฌธ ๋ช
๋ น)
{
type: 'PLUS'
}
// 1์ ๋นผ๋ ์ก์
(์ฃผ๋ฌธ ๋ช
๋ น)
{
type: 'MINUS'
}
// input ๊ฐ์(๋นต ์ ์ฌ๋ฃ ๋ฑ) ๋ณ๊ฒฝํ๋ ์ก์
(์ฃผ๋ฌธ ๋ช
๋ น)
{
type: 'CHANGE_INGREDIENT',
ingredient : 'corn',
price : 3000
}
// ์๋ก์ด ๊ฐ์ฒด(๋นต)๋ฅผ ์์ฑํ๋ ์ก์
(์ฃผ๋ฌธ ๋ช
๋ น)
{
type: 'CREATE_BREAD',
bread: {
name: 'corn_bread',
price: 4500
},
ingredient: {
name: 'corn',
value: '300g'
}
}
// 1๋ฒ์งธ ๋ฐฉ๋ฒ
const onPlus = () => {
dispatch({type : 'PLUS'})
}
<button onClick={onPlus}>Plus</button>
/// 2๋ฒ์งธ ๋ฐฉ๋ฒ
<button onClick={() => dispatch({ type: 'PLUS' })}>Plus</button>
๐ ๋นต ์ ์ ์์ฒญ์
: "์ฃผ๋ฐฉ์ฅ๋! ์ฌ๊ธฐ 'PLUS' 1ํ ์์ฒญ์ด์!"ย
import React, { useReducer } from 'react';
function reducer(state, action) {
switch (action.type) {
case 'PLUS':
return state + 1;
case 'MINUS':
return state - 1;
default:
return state;
}
}
function Baking() {
// 3์ value ์ ์ฅ
// ์์ ์ ์ธํ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ reducer ํจ์๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ!
// reducer์ ๋ก์ง๋ค์ ์คํ์ํฌ ๋ช
๋ น์ด๊ฐ ๋ด๊ฒจ์๋ dispatch ์ ์ธ
const [value, dispatch] = useReducer(reducer, 3);
const onPlus = () => {
dispatch({ type: 'PLUS' });
};
const onMinus = () => {
dispatch({ type: 'MINUS' });
};
return (
<div>
<h1>{number}</h1>
<button onClick={onPlus}>+1</button>
<button onClick={onMinus}>-1</button>
</div>
);
}
export default Baking;
โ
ํ๋ฆ
: ์ด๊ธฐ ๋๋๋ง ->ย useReducer() ์ ์ธ -> '+1' ๋ฒํผ ํด๋ฆญ
๐จโ๐ณ๐ณย ์ฃผ๋ฐฉ์ฅ
: ย "๋ค๋ค ์ฃผ๋ชฉ! ์ฐ๋ฆฌ ์ฃผ๋ฐฉ์ ์ ํด์ง ์ฃผ๋ฌธ์(dispatch)๋๋ก๋ง ์ ์(reducer)ํ๋ค! ์๊ฒ ๋?"
๐ง๐ง๐ปโ๐ณย ์ฃผ๋ฐฉ์๋ค
: "๋ต!"
ย
๐จโ๐ณ๐ณย ์ฃผ๋ฐฉ์ฅย
:ย "PLUS ์์ฒญ์ด ์ค๋ฉด ์ฌ๋ฃ๋ฅผ ์ด๋ป๊ฒ ํ๋ผ๊ณ ?"
๐ง๐ง๐ปโ๐ณย ์ฃผ๋ฐฉ์๋คย
: "ํ์ฌ ์ฌ๋ฃ ์ํ(number)์์ +1 ํฉ๋๋ค!"
๐ย ๋นต ์ ์ ์์ฒญ์ย
: "๋นต ์ฌ๋ฃ๋ฅผย ์ฒ์์๋ย 3๊ฐ๋ก ํด์ผ์ง~ย (initialState)"ย โ "๋ค ๊ณจ๋์ผ๋ ์ ์์ ๋ฃ์ด์ผ๊ฒ ๋ค!(state)"ย โ '+1' ๋ฒํผ์ ๋๋ฌ์ "PLUS" ์ฃผ๋ฌธ ์์ฒญ์ ํตํด์ ๋ฐ๊ฐ๋ฃจ๋ฅผ 4๊ฐ๋ก ๋ง๋ค์ด๋ฌ๋ผ๊ณ ํด์ผ๊ฒ ๋ค!ย
( [+1] ๋ฒํผ ํด๋ฆญ)
๐จโ๐ณ๐ณย ์ฃผ๋ฐฉ์ฅย
:ย "๋ค๋ค ์ฃผ๋ชฉ! ๋ฐฉ๊ธ dispatch๋ฅผ ํตํด์ action์ ์ทจํด๋ฌ๋ผ๊ณ ์์ฒญ์ด ์์ด ์ฌ๊ธฐ ์๋์.. ์ด๋ ๋ณด์~ type์ 'PLUS'๋ค? ๊ทธ๋ฆฌ๊ณ ๋ฐ๊ฐ๋ฃจ๋ฅผ 3๊ฐ๋ฅผ ๊ฐ์ด ๋ณด๋ด์ฃผ์๋ค..? ์ํค์ด ์ด์ ์๋์ ์ฅ์์์ฌ์ ํธํ๋๋ฐ.. ์๋ฌดํผ ์ฐ๋ฆฌ๋ PLUS ์์ฒญ์ด ์ค๋ฉด ์ฌ๋ฃ๋ฅผ ์ด๋ป๊ฒ ํ๋ผ๊ณ ?'
๐ง๐ง๐ปโ๐ณย ์ฃผ๋ฐฉ์๋คย
:ย "๋์ด์จ ์ฌ๋ฃ๋ฅผ (number)ย +1 ํฉ๋๋ค!"
๐จโ๐ณ๐ณย ์ฃผ๋ฐฉ์ฅย
:ย "๋ญ ํด ๋น์ฅ ์งํ์์ผ!(reducer ์ case ์คํ)