๐ปuseReducer๊ฐ ์์ฃผ ํท๊ฐ๋ฆฐ๋ค. ์ ๋ฏ ํ์ง๋ง ๋ชจ๋ฅด๊ฒ ๋ ์ํ๋ผ
useReducer๊ฐ์ ๋ํด ์กฐ๊ธ ๋ ๊ณต๋ถํด๋ณด์.
useState()
๋ฅผ ์ฌ์ฉuseReducer()
๋ฅผ ์ฌ์ฉ (๊ฐ์ฒด, ๋ฐฐ์ด ๊ฐ์ด ํ์ ์์๊ฐ ๋ง์ ๊ฒฝ์ฐ)const [state, dispatch] = useReducer(reducer, initialValue, init);
state
dispatch
reducer
๋ฅผ ์คํ์ํจ๋ค.reducer
state
๋ฅผ ์
๋ฐ์ดํธํ๋ ํจ์.dispatch
์ด๋ค. ๊ฒฐ๊ตญ **dispatch
๊ฐ ์คํ์ํค๋ ํจ์๊ฐ reducer
** ์ธ ๊ฒ!state
์ action
๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์์, ๊ธฐ์กด์ state
๋ฅผ ๋์ฒดํ ์๋ก์ด state
๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.initialValue
: initialState ์ํ์ ์ด๊ธฐ๊ฐinit
: ์ด๊ธฐ ํจ์ ( ์๋ต ๊ฐ๋ฅ)dispatch
์ ์ธ์๊ฐ ๋๋ค.reducer
ํจ์์ ๋ ๋ฒ์งธ ์ธ์์ธ action์ ํ ๋น๋๋ค.function reducer(state, action){ โฆ
reducer
ํจ์๋ฅผ ์คํ์ํจ๋ค.disspatch
ํจ์์ ์ธ์์ธ action
์ reducer
ํจ์์ ๋๋ฒ์งธ ์ธ์์ธ action์ ํ ๋น๋๋ค.<button onClick={()=> dispatch({type:"decrement"})}>
state
๋ฅผ ์๋ก์ด state
๋ก ๋์ฒดํด์ค๋ค! ( ์ถ๊ฐํ๊ฑฐ๋ ๋ฎ์ด์ฐ์ง ์๋๋ค.)import React, {useReducer} from 'react';
import './style.css';
//์๊ฐ reducer ํจ์
function reducer(state, action){
// state๊ฐ๊ณผ action์ type์ ํตํด reducer๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์
//ํ์ฌ state ๊ฐ์ฒด์ count์์ 1์ ๋นผ๊ณ , ๋ํ๊ณ ์ ๊ฐ์ ๋ฐํ
switch(action.type){
case "decrement":
return {count: state.count - 1};
case "increment":
return {count: state.count + 1};
}
}
export default function App() {
// useState๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ๋น์ทํ ํํ.
//[number, setNumber] ์์ ๊ฒฐ๊ตญ ๋ค์ ํจ์๊ฐ ์ธํฐ ํจ์์ด๊ณ ์ํ ๋ณ๊ฒฝ์ ํด์ค๋ค.
//๊ทธ๋ฌ๋ ๋ค์ ์ก์
์ ๋ฐ์์ํค๋ dispatchํจ์๋ฅผ๋ฅผ ์์ฑํด์ฃผ๋ฉด๋๋ค.
//๊ทธ๋ฆฌ๊ณ useReducer๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋๊ฑฐ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ์ ์ด๊ธฐ๊ฐ ์์ฑ.
const [number, dispatch] = useReducer(reducer, {count:0});
return (
<>
{/* state์ number์ ์๋ count๋ฅผ ๋ถ๋ฌ์์ผ ํ๊ธฐ ๋๋ฌธ์ {number.count} */}
<h1>Count: {number.count}</h1>
{/* ํด๋ฆญ ์ dispatchํจ์๋ฅผ ์คํํ๋ค. ์ง์ ๋ type์. */}
<button onClick={()=> dispatch({type:"decrement"})}> ๋นผ๊ธฐ </button>
<button onClick={()=> dispatch({type:"increment"})}> ๋ํํ๊ธฐ </button>
</>
);
}